在 ASP.NET Core Web API 中注册一个新的 DelegatingHandler

Posted

技术标签:

【中文标题】在 ASP.NET Core Web API 中注册一个新的 DelegatingHandler【英文标题】:Registering a new DelegatingHandler in ASP.NET Core Web API 【发布时间】:2016-11-02 17:03:49 【问题描述】:

我想创建一个扩展 DelegatingHandler 的新处理程序,使我能够在到达控制器之前做一些事情。我已经阅读了需要从 DelegatingHandler 继承的各个地方,然后像这样覆盖 SendAsync():

public class ApiKeyHandler : DelegatingHandler
        
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
              
        // do custom stuff here

        return base.SendAsync(request, cancellationToken);
    

这一切都很好而且很花哨,只是它什么也没做,因为我没有在任何地方注册它!同样,我在很多地方都看到我应该在 WebApiConfig.cs 中这样做,但这不是 ASP.NET Core 版本的 Web API 的一部分。我试图在 Startup.cs 文件(Configure()、ConfigureServices() 等)中找到各种类似的东西,但没有运气。

谁能告诉我应该如何注册我的新处理程序?

【问题讨论】:

它们现在不见了,例如,请参阅this article。建议改写OWIN中间件 如前文所述,请查看Writing middleware 【参考方案1】:

正如之前评论中已经提到的,请查看Writing your own middleware

您的ApiKeyHandler 可以转换为中间件类,该类在其构造函数中接受下一个RequestDelegate 并支持Invoke 方法,如下所示:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

namespace MyMiddlewareNamespace 

    public class ApiKeyMiddleware 
        private readonly RequestDelegate _next;
        private readonly ILogger _logger;
        private IApiKeyService _service;

        public ApiKeyMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IApiKeyService service) 
            _next = next;
            _logger = loggerFactory.CreateLogger<ApiKeyMiddleware>();
            _service = service
        

        public async Task Invoke(HttpContext context) 
            _logger.LogInformation("Handling API key for: " + context.Request.Path);

            // do custom stuff here with service      

            await _next.Invoke(context);

            _logger.LogInformation("Finished handling api key.");
        
    

中间件可以利用 UseMiddleware&lt;T&gt; 扩展 将服务直接注入到它们的构造函数中,如 下面的例子。依赖注入服务自动填充, 并且扩展需要一个 params 参数数组用于 非注入参数。

ApiKeyExtensions.cs

public static class ApiKeyExtensions 
    public static IApplicationBuilder UseApiKey(this IApplicationBuilder builder) 
        return builder.UseMiddleware<ApiKeyMiddleware>();
    

使用扩展方法和相关的中间件类, 配置方法变得非常简单易读。

public void Configure(IApplicationBuilder app) 
    //...other configuration

    app.UseApiKey();

    //...other configuration

【讨论】:

是否可以公平地说我们需要使用中间件而不是带有 DotnetCore 的消息处理程序? @shaikhspear 是的,这是一个公平的声明。

以上是关于在 ASP.NET Core Web API 中注册一个新的 DelegatingHandler的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core Web API

ASP.NET Core Web API 在 API GET 请求中检索空白记录

Asp.Net Core 1.1 消费web api

使用 ASP.NET Core MVC 创建 Web API

在c#asp.net core web api中创建jwt令牌[重复]

ASP.NET Core Web API 身份验证