要在Blazor WebAssembly应用程序中全局捕获401错误并跳转到登录页面,您可以使用自定义的HttpMessageHandler和拦截器来实现。以下是一个解决方法的示例:
AuthHttpMessageHandler的自定义HttpMessageHandler类。该类是一个派生自DelegatingHandler的中间件,用于拦截所有传出的Http请求并检查响应状态码。public class AuthHttpMessageHandler : DelegatingHandler
{
private readonly NavigationManager _navigationManager;
public AuthHttpMessageHandler(NavigationManager navigationManager)
{
_navigationManager = navigationManager;
}
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
_navigationManager.NavigateTo("login"); // 重定向到登录页面
}
return response;
}
}
AuthHttpMessageHandler作为HttpClient的默认处理程序。public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
// ...
builder.Services.AddScoped();
builder.Services.AddScoped(sp => new HttpClient(new AuthHttpMessageHandler(sp.GetRequiredService()))
{
BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)
});
// ...
await builder.Build().RunAsync();
}
@inject HttpClient httpClient
@code {
private async Task CallApi()
{
var response = await httpClient.GetAsync("api/some-endpoint");
if (!response.IsSuccessStatusCode)
{
// 401错误将在AuthHttpMessageHandler中被拦截和处理
// 在这里可以处理其他错误码
}
}
}
在上述代码中,当API返回401错误时,AuthHttpMessageHandler会拦截响应并通过NavigationManager将用户重定向到登录页面。您可以根据自己的需求进行修改和扩展。