12

Tôi muốn tạo một Trình xử lý mới mở rộng DelegatingHandler để cho phép tôi thực hiện các công cụ trước khi đi xa như bộ điều khiển. Tôi đã đọc ở những nơi khác nhau mà tôi cần cần phải kế thừa từ DelegatingHandler rồi Ghi đè SendAsync() như thế này:Đăng ký một DelegatingHandler mới trong ASP.NET Core Web API

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

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

Đây là tất cả tiền phạt và dandy trừ nó không làm bất cứ điều gì bởi vì tôi đã không đăng ký nó ở mọi nơi ! Một lần nữa, tôi đã thấy ở nhiều nơi mà tôi nên làm như vậy trong WebApiConfig.cs nhưng đó không phải là một phần của phiên bản ASP.NET Core của Web API. Tôi đã cố gắng để tìm tương tự amoungst những thứ khác nhau trong các tập tin Startup.cs (Configure(), ConfigureServices() vv) nhưng không có may mắn.

Mọi người có thể vui lòng cho tôi biết cách tôi nên đăng ký trình xử lý mới của mình không?

+1

Họ đã mất hết bây giờ, xem [bài viết này] (http://www.dotnetcurry.com/aspnet-mvc/1149/convert-aspnet-webapi2-aspnet5-mvc6) ví dụ. Đề xuất là viết phần mềm trung gian OWIN thay vì – Andrei

+0

Như đã đề cập trong nhận xét trước, hãy xem [Viết phần mềm trung gian] (https://docs.asp.net/en/latest/fundamentals/middleware.html#writing-middleware) – Nkosi

Trả lời

13

Như đã đề cập trong bình luận trước, nhìn vào Writing your own middleware

bạn ApiKeyHandler có thể được chuyển đổi thành một lớp trung gian mà mất trong tiếp theo RequestDelegate trong constructor của nó và hỗ trợ một phương pháp Invoke như:

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 có thể tận dụng lợi thế của việc mở rộng UseMiddleware<T> để dịch vụ bơm trực tiếp vào các nhà thầu của họ, như được hiển thị trong ví dụ bên dưới. Các dịch vụ được tiêm tự động phụ thuộc được tự động điền, và phần mở rộng lấy một mảng đối số params được sử dụng cho các tham số không được tiêm .

ApiKeyExtensions.cs

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

Sử dụng phương pháp mở rộng và lớp trung gian liên quan, các phương pháp Cấu hình trở nên rất đơn giản và dễ đọc.

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

    app.UseApiKey(); 

    //...other configuration 
} 
Các vấn đề liên quan