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

我想创建一个新的Handler,它扩展了DelegatingHandler,使我能够在进入控制器之前做一些事情。 我已经在各个地方读过我需要从DelegatingHandlerinheritance,然后像这样覆盖SendAsync():

public class ApiKeyHandler : DelegatingHandler { protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // do custom stuff here return base.SendAsync(request, cancellationToken); } } 

这一切都很好,花花公子除了它没有做任何事情,因为我没有在任何地方注册! 我再次在很多地方看到我应该在WebApiConfig.cs中这样做,但这不是Web API的ASP.NET 核心版本的一部分。 我试图找到类似于Startup.cs文件(Configure(),ConfigureServices()等)中的各种东西,但没有运气。

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

正如之前的评论中已经提到的,请研究编写自己的中间件

您的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(); _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扩展将服务直接注入其构造函数,如下面的示例所示。 自动填充dependency injection服务,扩展使用params数组用于非注入参数。

ApiKeyExtensions.cs

 public static class ApiKeyExtensions { public static IApplicationBuilder UseApiKey(this IApplicationBuilder builder) { return builder.UseMiddleware(); } } 

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

 public void Configure(IApplicationBuilder app) { //...other configuration app.UseApiKey(); //...other configuration }