在 ASP.NET Core 5.0 Web API 中实现 DelegatingHandler?

Val*_*ley 8 c# asp.net asp.net-web-api asp.net-core

    public class AuthenticationHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage req, CancellationToken cancellationToken)
        {
            Debug.WriteLine("Process request");
            // Call the inner handler.
            var response = await base.SendAsync(req, cancellationToken);
            Debug.WriteLine("Process response");
            return response;
        }
    }
Run Code Online (Sandbox Code Playgroud)

解决方案文件:https://i.stack.imgur.com/M4yv6.png

我能找到的唯一答案是旧版本的 Web API,其中解决方案的结构非常不同

Ada*_*dam 8

如果您使用 DelegatingHandler 来实现从 Web API 到另一个服务的出站请求的横切关注点,则可以使用 HttpClientFactory 注册您的处理程序并将其附加到命名或类型化的 HttpClient:

来自https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0#outgoing-request-middleware-1

HttpClient 具有委托处理程序的概念,这些处理程序可以链接在一起以用于传出 HTTP 请求。IHttpClientFactory:

简化定义应用于每个指定客户端的处理程序。

支持注册和链接多个处理程序以构建传出请求中间件管道。这些处理程序中的每一个都能够在传出请求之前和之后执行工作。这个模式:

类似于 ASP.NET Core 中的入站中间件管道。提供一种机制来管理围绕 HTTP 请求的横切关注点,例如: 缓存 错误处理 序列化 日志记录

在这种方法下,您可以将启动中的处理程序注册到 DI 容器中,以便在将其注入或实例化到服务中的某个位置时,将其附加到使用客户端进行的任何调用:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddTransient<AuthenticationHandler>();

    services.AddHttpClient<MyTypedHttpClient>(c =>
    {
        c.BaseAddress = new Uri("https://localhost:5001/");
    })
    .AddHttpMessageHandler<AuthenticationHandler>();
    
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您要将行为附加到 API 使用者对 Web API 的入站请求,则可以改用中间件: https: //learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/ ?view=aspnetcore -5.0