在 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<T>
扩展 将服务直接注入到它们的构造函数中,如 下面的例子。依赖注入服务自动填充, 并且扩展需要一个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 在 API GET 请求中检索空白记录
使用 ASP.NET Core MVC 创建 Web API