2012-11-29 8 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。そのコントローラーにのみ適用するために、そのコントローラーに固有のハンドラーを作成する必要があります。ごとのルートメッセージハンドラのパイプラインは、あなたがhereを見ることができるようになりますかについて

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

+0

感謝を。 – user1135534

+0

@ kiran-challaとNick、 "Attribute Routing"と同じように動作させるには?それも可能ですか? –

+0

最後に死んだリンク –

5

あなたができることは、ルートごとのメッセージハンドラを使用することですが、ここでは注意してください。彼の答えに@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); 
    } 
} 

、あなたはそれを登録する方法:

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

SomeOtherHandler1SomeOtherHandler2後が実行されると、CustomerOrdersHttpRouteルートに対してCustomerOrdersDispatcherが実行されます。したがって、デフォルトハンドラの動作を保持し、ルート固有のハンドラを設定している間にグローバルハンドラを設定することができます。

私のCustomerOrdersDispatcherhttps://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.csの完全実装です。

あなたはそれがうまくいく方法を確認するだけでなく、完全なサンプルアプリケーションのソースコードを表示可能性があります。その本当に自明リンクについてhttps://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample

関連する問題