我想创建一个新的Handler,它扩展了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()等)中的各种东西,但没有运气。
有谁能告诉我如何注册我的新处理程序?
答案 0 :(得分:17)
正如之前评论中已经提到的,请查看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
}