2012-11-29 49 views
11

我寫了一個自定義委託處理程序,它將自定義標頭添加到請求中的響應&檢查中。ASP.NET Web API中控制器特有的自定義委託處理程序

我添加了手柄中的WebAPI配置

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

但問題是適用於所有控制器。我需要將自定義標題應用於控制器。是否可以添加特定於控制器的自定義處理程序?

回答

15

在本文末尾,它解釋瞭如何將處理程序僅應用於某些路線:http://www.asp.net/web-api/overview/working-with-http/http-message-handlers。您可能必須爲您的控制器創建唯一的處理程序,以便僅將其應用於該控制器。

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()); 
    ); 

關於如何每個路由消息處理程序的管道會是什麼樣子,你可以看看here

+0

感謝您的鏈接,其真正的自我解釋。 – user1135534

+0

@ kiran-challa和Nick,如何與「屬性路由」一起工作?它甚至有可能嗎? –

+0

最後一句中的死鏈接 –

5

你可以做的是使用per-route消息處理程序,但在這裏要小心。正如@Nick在他的回答中鏈接的文章,您可以鏈接處理程序並確保涉及HttpControllerDispatcher。否則,你將不會進入控制器管道。

另一個選擇,我喜歡的是使用HttpControllerDispatcher作爲基類的自定義處理程序:

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

在這裏,你將如何進行註冊:

SomeOtherHandler1SomeOtherHandler2
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()); 
} 

後執行您的CustomerOrdersDispatcher將執行CustomerOrdersHttpRoute路線。因此,您可以看到您保留了默認的處理程序行爲並設置了一些全局處理程序,同時還有一個特定的路由。

以下是我的CustomerOrdersDispatcher的全部實施:https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs

您可以查看完整的示例應用程序的源代碼,以及看看它是如何工作:https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample

相關問題