Регистрация нового DelegatingHandler в веб-API ASP.NET Core

Я хочу создать новый обработчик, который расширяет 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, но это не является частью версии веб-API ASP.NET Core. Я пытался найти аналоги среди различных вещей в файле Startup.cs (Configure (), ConfigureServices () и т. Д.), Но безуспешно.

Кто-нибудь, пожалуйста, скажите мне, как мне зарегистрироваться для регистрации моего нового обработчика?


person Ben    schedule 02.11.2016    source источник
comment
Теперь их больше нет, см. эту статью Например. Предлагаем вместо этого написать промежуточное ПО OWIN   -  person Andrei    schedule 02.11.2016
comment
Как уже упоминалось в предыдущем комментарии, изучите Написание промежуточного программного обеспечения   -  person Nkosi    schedule 02.11.2016


Ответы (1)


Как уже упоминалось в предыдущем комментарии, загляните в Написание собственного промежуточного программного обеспечения

Ваш 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>();
    }
}

Используя метод расширения и связанный с ним класс промежуточного программного обеспечения, метод Configure становится очень простым и читаемым.

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

    app.UseApiKey();

    //...other configuration
}
person Nkosi    schedule 02.11.2016
comment
Можете ли вы сказать мне, что такое IApiKeyService и откуда я могу это получить? - person prog1011; 14.05.2019
comment
На самом деле тебе это не нужно - person Antonio Rodríguez; 17.08.2020