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

时间:2016-11-02 17:03:49

标签: c# asp.net-web-api asp.net-core asp.net-core-mvc asp.net-core-webapi

我想创建一个新的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()等)中的各种东西,但没有运气。

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

1 个答案:

答案 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
}