2012-11-29 10 views
11

Tôi đã viết Trình xử lý ủy nhiệm tùy chỉnh, thêm tiêu đề tùy chỉnh vào phản hồi & kiểm tra trong yêu cầu.Trình xử lý ủy quyền tùy chỉnh cụ thể cho Bộ điều khiển trong ASP.NET Web API

tôi đã thêm các xử lý trong cấu hình WebAPI

config.MessageHandlers.Add(new customHandler());

Nhưng vấn đề được áp dụng cho tất cả các bộ điều khiển. Tôi cần phải áp dụng tiêu đề tùy chỉnh cụ thể cho một bộ điều khiển. Có thể thêm trình xử lý tùy chỉnh cụ thể cho bộ điều khiển không?

Trả lời

15

Ở cuối bài viết này, giải thích cách chỉ áp dụng các trình xử lý cho các tuyến đường nhất định: http://www.asp.net/web-api/overview/working-with-http/http-message-handlers. Bạn có thể phải tạo một trình xử lý duy nhất cho bộ điều khiển của bạn để nó chỉ áp dụng cho bộ điều khiển đó.

config.Routes.MapHttpRoute(
     name: "MyCustomHandlerRoute", 
     routeTemplate: "api/MyController/{id}", 
     defaults: new { controller = "MyController", id = RouteParameter.Optional }, 
     constraints: null, 
     handler: HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), new MyCustomDelegatingMessageHandlerA()); 
    ); 

Về cách thức xử lý thông báo cho mỗi tuyến đường như thế nào, bạn có thể xem here.

+0

Cảm ơn Link, nó thực sự tự giải thích. – user1135534

+0

@ kiran-challa và Nick, Làm cách nào để làm việc tương tự với "Định tuyến thuộc tính"? Thậm chí có thể không? –

+0

liên kết chết trong câu cuối cùng –

5

Việc bạn có thể làm là sử dụng trình xử lý tin nhắn trên mỗi tuyến đường nhưng hãy cẩn thận tại đây. Theo bài viết mà @Nick được liên kết trong câu trả lời của mình, bạn có thể xử lý chuỗi và đảm bảo rằng HttpControllerDispatcher có liên quan. Nếu không, bạn sẽ không nhận được vào đường ống điều khiển.

Một lựa chọn khác mà tôi thích là sử dụng HttpControllerDispatcher như một lớp cơ sở cho trình xử lý tuỳ chỉnh của bạn:

public class CustomerOrdersDispatcher : HttpControllerDispatcher { 

    public CustomerOrdersDispatcher(HttpConfiguration config) 
     : base(config) { 
    } 

    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, 
     CancellationToken cancellationToken) { 

     // Do some stuff here... 

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

Ở đây, làm thế nào bạn sẽ đăng ký nó:

protected void Application_Start(object sender, EventArgs e) { 

    var config = GlobalConfiguration.Configuration; 

    config.Routes.MapHttpRoute(
     name: "CustomerOrdersHttpRoute", 
     routeTemplate: "api/customers/{customerKey}/orders/{key}", 
     defaults: new { controller = "CustomerOrders", key = RouteParameter.Optional }, 
     constraints: null, 
     handler: new CustomerOrdersDispatcher(config) 
    ); 

    config.MessageHandlers.Add(new SomeOtherHandler1()); 
    config.MessageHandlers.Add(new SomeOtherHandler2()); 
} 

Sau SomeOtherHandler1SomeOtherHandler2 được thực thi, CustomerOrdersDispatcher của bạn sẽ được thực thi cho CustomerOrdersHttpRoute tuyến. Vì vậy, bạn có thể thấy rằng bạn giữ lại hành vi xử lý mặc định và thiết lập một số trình xử lý toàn cục trong khi bạn cũng có một trình xử lý cụ thể.

Dưới đây là việc triển khai đầy đủ CustomerOrdersDispatcher: https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs của tôi.

Bạn có thể xem mã nguồn ứng dụng đầy đủ mẫu cũng như để xem làm thế nào nó hoạt động ra: https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample