DelegatingHandler使用处理 401 响应代码创建自定义。
public class CustomMessageHandler : DelegatingHandler
{
private readonly string host;
readonly NavigationManager _navigationManager;
CustomMessageHandler(IWebAssemblyHostEnvironment webAssemblyHostEnvironment, navigationManager)
{
host = webAssemblyHostEnvironment.BaseAddress;
_navigationManager = navigationManager;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
Console.WriteLine("CustomMessageHandler catch 401");
// TODO: some logic (e.g. refreshing token)
// Or just redirect to login page.
string loingUrl = "http://some-site/login";
_navigationManager.NavigateTo(loingUrl, forceLoad: true);
}
return response;
}
}
- 在IServiceCollection中注册创建的CustomMessageHandler(在blazor.Client项目中)
builder.Services.AddScoped<CustomMessageHandler>();
- 还向我们的 CustomMessageHandler 注册配置的 httpClient(在 blazor.Client 项目中)。
.AddHttpClient需要Microsoft.Extensions.Httpnuget包。
builder.Services.AddHttpClient("BlazorServerHttpClient",
client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<CustomMessageHandler>();
- 从 blazor.Client 到 blazor.Server 的所有 httpClient 请求都必须像这样使用 IHttpClientFactory:
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
public class WeatherService
{
private readonly IHttpClientFactory _clientFactory;
public WeatherService(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task<WeatherForecast[]> GetWeatherForecast()
{
var client = _clientFactory.CreateClient("BlazorServerHttpClient");
WeatherForecast[] result = await client.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
return result;
}
}