wake-up-neo.net

Registrieren eines neuen DelegatingHandlers in der ASP.NET Core-Web-API

Ich möchte einen neuen Handler erstellen, der DelegatingHandler erweitert, damit ich Aufgaben ausführen kann, bevor ich zum Controller komme. Ich habe an verschiedenen Stellen gelesen, dass ich SendAsync () wie folgt überschreiben muss, um es von DelegatingHandler zu erben:

public class ApiKeyHandler : DelegatingHandler
{        
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {          
        // do custom stuff here

        return base.SendAsync(request, cancellationToken);
    }
}

Das ist alles in Ordnung und gut, außer dass es nichts bringt, weil ich es nirgendwo registriert habe! Wieder habe ich an zahlreichen Stellen gesehen, dass ich dies in WebApiConfig.cs tun sollte, aber das ist kein Teil der ASP.NET Core -Version der Web-API. Ich habe versucht, Analoga unter den verschiedenen Dingen in der Datei Startup.cs (Configure (), ConfigureServices () usw.) zu finden, aber kein Glück.

Kann mir jemand sagen, wie ich meinen neuen Handler registrieren soll?

23
Ben

Schauen Sie, wie bereits im vorherigen Kommentar erwähnt, in Schreiben Ihrer eigenen Middleware

Ihr ApiKeyHandler kann in eine Middleware-Klasse konvertiert werden, die das nächste RequestDelegate in ihrem Konstruktor aufnimmt und eine Invoke -Methode wie folgt unterstützt:

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.");
        }
    }
}

Middleware kann die UseMiddleware<T> Erweiterung, um Services direkt in ihre Konstruktoren einzufügen, wie im folgenden Beispiel gezeigt. Injizierte Dienste für Abhängigkeiten werden automatisch gefüllt, und die Erweiterung benötigt ein params -Array von Argumenten, die für nicht injizierte Parameter verwendet werden.

ApiKeyExtensions.cs

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

Mit der Erweiterungsmethode und der zugehörigen Middleware-Klasse wird die Configure-Methode sehr einfach und lesbar.

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

    app.UseApiKey();

    //...other configuration
}
21
Nkosi