ASP.NET Web API(C#)の組み込みメッセージハンドラーとは?仕組みと種類を解説
メッセージハンドラー(Message Handler)とは、HTTPリクエストを受け取り、HTTPレスポンスを返す役割を持つクラスのことです。すべてのメッセージハンドラーは、抽象クラス HttpMessageHandler から派生します。このハンドラーを利用することで、リクエストが HttpControllerDispatcher に到達する前に、その内容を処理・編集、あるいは拒否することができます。
メッセージハンドラーは、リクエスト処理パイプラインのごく早い段階で実行されるため、Web APIにおける横断的関心事(クロスカッティングコンサーン)を実装するのに最適な場所です。メッセージハンドラーとは、パイプラインを通じてHTTPリクエストとレスポンスを順次処理していく、一連のクラスの連鎖(システム定義のものでも、開発者が独自に定義したものでも可)にほかなりません。
メッセージハンドラーの基本的な流れ
例えば、あるHTTPリクエストがHTTPサーバーに到着した場合、まず最初のハンドラー(HandlerA)に渡され、そこでの処理が完了すると次のハンドラー(HandlerB)へと引き継がれていきます。この仕組みの大きな利点は、ビジネス要件に応じて各ハンドラー内で特定のタスクを実行できる点にあります。
メッセージハンドラーの2つの種類
ASP.NET Web APIフレームワークでは、以下の2種類のメッセージハンドラーが利用できます。
- サーバーサイドHTTPメッセージハンドラー
- クライアントサイドHTTPメッセージハンドラー
サーバーサイドのメッセージハンドラー
サーバーサイドでは、Web APIパイプラインが次のような組み込みメッセージハンドラーを使用します。
- HttpServer: ホストからリクエストを受け取ります。
- HttpRoutingDispatcher: ルート情報に基づいてリクエストを振り分けます。
- HttpControllerDispatcher: リクエストをWeb APIコントローラーへ送信します。
これらのパイプラインには、開発者が作成したカスタムハンドラーを自由に追加することも可能です。メッセージハンドラーは、コントローラーアクションではなくHTTPメッセージそのもののレベルで動作する横断的関心事の実装に適しています。具体的には、次のような用途が挙げられます。
- リクエストヘッダーの読み取りや変更
- レスポンスへのカスタムヘッダーの追加
- リクエストがコントローラーに到達する前の事前検証(認証チェックなど)
クライアントサイドのメッセージハンドラー
クライアントサイドでは、HttpClient クラスがメッセージハンドラーを使ってリクエストを処理します。既定のハンドラーは HttpClientHandler であり、ネットワーク経由でリクエストを送信し、サーバーからレスポンスを受け取る役割を担います。クライアント側のパイプラインにも、カスタムメッセージハンドラーを挿入できます。
まとめ
メッセージハンドラーは、HTTPリクエスト/レスポンスの流れの中で早期に処理を介入できる強力な拡張ポイントです。認証、ログ出力、ヘッダー操作など、API全体で共通して必要となる処理をハンドラーとして切り出すことで、コードの再利用性と保守性を高めることができます。
-
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 {