ASP.NET Web API(C#)におけるDelegatingHandlerの使い方とは?カスタムメッセージハンドラーの実装を解説
ASP.NET Web APIでは、複数のメッセージハンドラーがチェーン状につながっています。最初のハンドラーがHTTPリクエストを受け取り、何らかの処理を行った後、そのリクエストを次のハンドラーへ渡します。そしてどこかの時点でレスポンスが生成されると、今度は逆にチェーンをさかのぼって呼び出し元へ返されていきます。この一連の仕組みはデリゲーティングハンドラー(Delegating Handler)と呼ばれるパターンです。
サーバーサイドには組み込みのメッセージハンドラーが用意されていますが、開発者が独自のサーバーサイドHTTPメッセージハンドラーを作成することも可能です。ASP.NET Web APIでカスタムのサーバーサイドHTTPメッセージハンドラーを作成するには、DelegatingHandlerクラスを利用します。具体的には、System.Net.Http.DelegatingHandlerから派生したクラスを作成し、SendAsyncメソッドをオーバーライドします。
SendAsyncメソッドのシグネチャ
Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);
このメソッドはHttpRequestMessageを入力として受け取り、HttpResponseMessageを非同期に返します。典型的な実装では、以下のような流れで処理が行われます。
- リクエストメッセージを処理する。
- base.SendAsyncを呼び出して、リクエストを内部ハンドラー(inner handler)へ送る。
- 内部ハンドラーがレスポンスメッセージを返す。(このステップは非同期で実行される。)
- レスポンスを処理し、呼び出し元へ返す。
実装例:リクエストとレスポンスを処理する基本的なハンドラー
public class CustomMessageHandler : DelegatingHandler{ protected async override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken){ Debug.WriteLine("CustomMessageHandler processing the request"); // 内部ハンドラーを呼び出す var response = await base.SendAsync(request, cancellationToken); Debug.WriteLine("CustomMessageHandler processing the response"); return response; }}なお、デリゲーティングハンドラーは、内部ハンドラーを経由せずに、自ら直接レスポンスを生成して返すこともできます。この手法は、認証失敗時に即座に401レスポンスを返す場合などに活用されます。
実装例:内部ハンドラーをスキップしてレスポンスを直接返す
public class CustomMessageHandler : DelegatingHandler{ protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken){ // レスポンスを作成する var response = new HttpResponseMessage(HttpStatusCode.OK){ Content = new StringContent("Skipping the inner handler") }; // TaskCompletionSourceはデリゲートを持たないタスクを生成する var taskCompletion = new TaskCompletionSource<HttpResponseMessage>(); taskCompletion.SetResult(response); return taskCompletion.Task; }}カスタムハンドラーの登録方法
作成したカスタムハンドラーを実際に有効化するには、WebApiConfig.csなどの構成ファイルでHttpConfigurationに登録する必要があります。
config.MessageHandlers.Add(new CustomMessageHandler());
DelegatingHandlerは、認証・認可処理、ロギング、例外処理、CORS対応など、リクエストとレスポンスに対する横断的な処理を実装したい場面で非常に役立つ仕組みです。パイプラインのどの位置に挿入するかによって処理順序が変わるため、目的に応じて適切に設計することが重要です。
-
C# ASP.NET Web APIのフィルターの種類と使い方を徹底解説
ASP.NET Web APIフレームワークでは、リクエスト処理のさまざまな段階に追加のロジックを組み込むために「フィルター」が使用されます。フィルターは、ロギング、認可、キャッシュといった横断的関心事(クロスカッティングコンサーン)を実装するための仕組みであり、アクションメソッドやコントローラーに対して、宣言的またはプログラム的に適用できます。ここでは、C#のWeb APIで利用できる主なフィルターの種類について詳しく見ていきましょう。Web APIの主なフィルターの種類1. 認証フィルター(Authentication Filter)認証フィルターは、ユーザーの身元情報を検証するために使用
-
C# ASP.NET Web APIにおけるコントローラーアクションの4つの戻り値の型とは?
ASP.NET Web APIのアクションメソッドには、主に以下の4種類の戻り値の型を指定することができます。 void(戻り値なし) プリミティブ型/複合型 HttpResponseMessage IHttpActionResult 1. void(戻り値なし) すべてのアクションメソッドが必ずしも何かを返す必要はありません。戻り値の型としてvoidを指定することも可能です。 コード例 using DemoWebApplication.Models; using System.Web.Http; namespace DemoWebApplication.Controllers {