如何在 Blazor WASM 中添加 HTTP 拦截器?

Par*_*a99 3 blazor blazor-webassembly

在 Angular 中,有 HTTP拦截器功能。如何在 Blazor WASM 中实现相同的目标?

HTTP拦截器

(拦截器的顺序很重要)

Dim*_*kos 7

您可以使用委托处理程序。创建一个新类扩展DelegatingHandler

public class MyDelegatingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // before request
        
        var response = await base.SendAsync(request, cancellationToken);
        
        // after request
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在Program.cs中注册:

using Microsoft.Extensions.DependencyInjection;
...

builder.Services.AddTransient<MyDelegatingHandler>();

builder.Services
    .AddHttpClient("ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    .AddHttpMessageHandler<MyDelegatingHandler>();
Run Code Online (Sandbox Code Playgroud)

文档

来自文档:

可以按照它们应执行的顺序注册多个处理程序。每个处理程序都会包装下一个处理程序,直到最后一个处理HttpClientHandler程序执行请求:

using Microsoft.Extensions.DependencyInjection;
...

builder.Services.AddTransient<SampleHandler1>();
builder.Services.AddTransient<SampleHandler2>();

builder.Services.AddHttpClient("MultipleHttpMessageHandlers")
    .AddHttpMessageHandler<SampleHandler1>()
    .AddHttpMessageHandler<SampleHandler2>();
Run Code Online (Sandbox Code Playgroud)

在前面的代码中,SampleHandler1首先运行,在 之前SampleHandler2