14

応答にカスタムヘッダーを追加し、要求をチェックするカスタム委任ハンドラーを作成しました。

WebAPi構成にハンドルを追加しました

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

ただし、この問題はすべてのコントローラーに当てはまります。コントローラに固有のカスタムヘッダーを適用する必要があります。コントローラに固有のカスタムハンドラを追加することは可能ですか?

4

2 に答える 2

17

この記事の最後では、ハンドラーを特定のルートにのみ適用する方法について説明しています: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());
    );

ルートごとのメッセージハンドラーのパイプラインがどのように見えるかについては、こちらをご覧ください。

于 2012-11-29T16:08:02.457 に答える
6

ルートごとのメッセージハンドラーを使用できますが、ここでは注意してください。@Nickが彼の回答にリンクした記事として、ハンドラーをチェーンして、HttpControllerDispatcherが関与していることを確認できます。そうしないと、コントローラーパイプラインに入ることができません。

私が好きなもう1つのオプションは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

于 2012-11-29T16:33:44.093 に答える