応答にカスタムヘッダーを追加し、要求をチェックするカスタム委任ハンドラーを作成しました。
WebAPi構成にハンドルを追加しました
config.MessageHandlers.Add(new customHandler());
ただし、この問題はすべてのコントローラーに当てはまります。コントローラに固有のカスタムヘッダーを適用する必要があります。コントローラに固有のカスタムハンドラを追加することは可能ですか?
応答にカスタムヘッダーを追加し、要求をチェックするカスタム委任ハンドラーを作成しました。
WebAPi構成にハンドルを追加しました
config.MessageHandlers.Add(new customHandler());
ただし、この問題はすべてのコントローラーに当てはまります。コントローラに固有のカスタムヘッダーを適用する必要があります。コントローラに固有のカスタムハンドラを追加することは可能ですか?
この記事の最後では、ハンドラーを特定のルートにのみ適用する方法について説明しています: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());
);
ルートごとのメッセージハンドラーのパイプラインがどのように見えるかについては、こちらをご覧ください。
ルートごとのメッセージハンドラーを使用できますが、ここでは注意してください。@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());
}
SomeOtherHandler1
とSomeOtherHandler2
が実行された後、 CustomerOrdersHttpRouteルートCustomerOrdersDispatcher
に対して実行されます。したがって、ルート固有のハンドラーを使用しているときに、デフォルトのハンドラーの動作を維持し、いくつかのグローバルハンドラーを設定していることがわかります。
これが私の完全な実装ですCustomerOrdersDispatcher
:https ://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs 。
完全なサンプルアプリケーションのソースコードも表示して、どのように機能するかを確認できます:https ://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample