12

DelegatingHandler'ı denetleyici kadar uzaklaşmadan önce yapmamı sağlayan yeni bir İşleyici oluşturmak istiyorum.Yeni bir DelegatingHandler'ı ASP.NET Çekirdek Web API'sine Kaydetme

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

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

Bu her yerde onu kayıtlı değil çünkü o hiçbir şey yapmaz dışında tüm iyi, güzel: Ben o zaman böyle SendAsync() geçersiz kılabilir DelegatingHandler devralmak için gereken ihtiyaç çeşitli yerlerde okudum ! Yine, WebApiConfig.cs içinde yapmam gereken çok sayıda yerde gördüm ama bu, Web API'sinin ASP.NET Çekirdek sürümünün bir parçası değil. Startup.cs dosyasındaki (Configure(), ConfigureServices() vb.) Çeşitli şeylerde analog bulmaya çalıştım ama şans yok.

Lütfen bana yeni işleyicimi kaydetme konusunda nasıl gitmem gerektiğini söyler misiniz? Zaten önceki açıklamada bahsedilen

+1

, örneğin [Bu makale] (http://www.dotnetcurry.com/aspnet-mvc/1149/convert-aspnet-webapi2-aspnet5-mvc6) bakınız. Öneri, OWIN ara katmanını – Andrei

+0

yerine yazmaktır. Önceki yorumda daha önce bahsedildiği gibi, [Yazma ara katmanları] 'na bakın (https://docs.asp.net/en/latest/fundamentals/middleware.html#writing-middleware) – Nkosi

cevap

13

gibi, içine bakmak Writing your own middleware

Sizin ApiKeyHandler gösterildiği gibi onun kurucu sonraki RequestDelegate alır ve bir Invoke yöntemini destekleyen bir katman sınıfına dönüştürülebilir:

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,'de gösterildiği gibi UseMiddleware<T> uzantısını aktarım hizmetlerinden doğrudan yapıcılarına kullanabilir. Aşağıdakiörnek. Enjekte edilen hizmetler, otomatik olarak doldurulur, ve uzantı, enjekte edilmemiş parametreler için kullanılacak bir params argüman dizisi alır. uzantısı yöntem ve ilgili katman sınıfı kullanılması

ApiKeyExtensions.cs

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

, yapılandırma yöntem çok basittir ve okunabilir hale gelir.

Onlar şimdi gitti
public void Configure(IApplicationBuilder app) { 
    //...other configuration 

    app.UseApiKey(); 

    //...other configuration 
} 
İlgili konular