ASP.NET HTTP モジュールと HTTP ハンドラー
この記事では、ASP.NET ハイパーテキスト転送プロトコル (HTTP) モジュールと HTTP ハンドラーについて説明します。
元の製品バージョン: ASP.NET
元の KB 番号: 307985
まとめ
HTTP モジュールと HTTP ハンドラーは、ASP.NET アーキテクチャに不可欠な部分です。 要求が処理されている間、各要求は複数の HTTP モジュール (たとえば、認証モジュールとセッション モジュール) によって処理され、その後、1 つの HTTP ハンドラーによって処理されます。 ハンドラーが要求を処理した後、要求は HTTP モジュールを経由して戻されます。
HTTP モジュールの概要
モジュールは、ハンドラーの実行前と実行後に呼び出されます。 モジュールを使用すると、開発者は個々の要求をインターセプト、参加、または変更できます。 モジュールは、System.Web
名前空間にあるIHttpModule
インターフェイスを実装します。
HTTP モジュールが同期できる使用可能なイベント
HttpApplication
クラスには、モジュールが同期できるイベントが多数用意されています。 各要求で同期するモジュールでは、次のイベントを使用できます。 これらのイベントは順番に一覧表示されます。
BeginRequest
: 要求が開始されました。 要求の開始時に何かを行う必要がある場合 (たとえば、各ページの上部に広告バナーを表示する)、このイベントを同期します。AuthenticateRequest
: 独自のカスタム認証スキームをプラグインする場合 (たとえば、データベースに対してユーザーを検索してパスワードを検証する)、このイベントを同期してユーザーを認証するモジュールを構築します。AuthorizeRequest
: このイベントは、承認メカニズムを実装するために内部的に使用されます (たとえば、アクセス制御リスト (ACL) をファイル システムではなくデータベースに格納します)。 このイベントはオーバーライドできますが、これを行う理由はあまりありません。ResolveRequestCache
: このイベントは、出力キャッシュからページを提供できるかどうかを決定します。 独自のキャッシュ モジュールを作成する場合 (たとえば、メモリ キャッシュではなくファイル ベースのキャッシュを構築する場合)、このイベントを同期して、キャッシュからページを提供するかどうかを判断します。AcquireRequestState
: セッション状態は状態ストアから取得されます。 独自の状態管理モジュールを構築する場合は、このイベントを同期して、状態ストアからセッション状態を取得します。PreRequestHandlerExecute
: このイベントは、HTTP ハンドラーが実行される前に発生します。PostRequestHandlerExecute
: このイベントは、HTTP ハンドラーが実行された後に発生します。ReleaseRequestState
: セッション状態は状態ストアに格納されます。 カスタム セッション状態モジュールを構築する場合は、状態を状態ストアに格納し直す必要があります。UpdateRequestCache
: このイベントは出力キャッシュに出力を書き戻します。 カスタム キャッシュ モジュールをビルドする場合は、出力をキャッシュに書き戻します。EndRequest
: 要求が完了しました。 要求全体で情報を収集し、その情報をページに書き込むデバッグ モジュールを構築できます。
次のイベントは、モジュールが要求の送信ごとに同期するために使用できます。 これらのイベントの順序は非決定論的です。
PreSendRequestHeaders
: このイベントは、ヘッダーが送信される前に発生します。 ヘッダーを追加する場合は、カスタム モジュールからこのイベントを同期できます。PreSendRequestContent
: このイベントは、Response.Flush
メソッドが呼び出されたときに発生します。 追加のコンテンツを追加する場合は、カスタム モジュールからこのイベントを同期できます。Error
: このイベントは、ハンドルされない例外が発生したときに発生します。 カスタム エラー ハンドラー モジュールを記述する場合は、このイベントを同期します。
HTTP モジュールを構成する
<httpModules>
構成セクション ハンドラーは、アプリケーション内で HTTP モジュールを構成する役割を担います。 コンピューター、サイト、またはアプリケーション レベルで宣言できます。 <httpModules>
セクション ハンドラーには、次の構文を使用します。
<httpModules>
<add type="[COM+ Class], [Assembly]" name="[ModuleName]" />
<remove type="[COM+ Class], [Assembly]" name="[ModuleName]" />
<clear />
</httpModules>
HTTP モジュールを作成する
HTTP モジュールを作成するには、 IHttpModule
インターフェイスを実装する必要があります。 IHttpModule
インターフェイスには、次のシグネチャを持つ 2 つのメソッドがあります。
void Init(HttpApplication);
void Dispose();
HTTP ハンドラーの概要
ハンドラーは、個々のエンドポイント要求を処理するために使用されます。 ハンドラーを使用すると、ASP.NET フレームワークで、アプリケーション内の個々の HTTP URL または URL 拡張機能のグループを処理できます。 モジュールとは異なり、要求の処理に使用されるハンドラーは 1 つだけです。 すべてのハンドラーは、System.Web namespace
にあるIHttpHandler
インターフェイスを実装します。 ハンドラーは、インターネット サーバー アプリケーション プログラミング インターフェイス (ISAPI) 拡張機能に似ています。
HTTP ハンドラーを構成する
<httpHandlers>
構成セクション ハンドラーは、受信 URL を IHttpHandler
または IHttpHandlerFactory
クラスにマッピングします。 コンピューター、サイト、またはアプリケーション レベルで宣言できます。 サブディレクトリは、これらの設定を継承します。
管理者は、 <add>
タグ ディレクティブを使用して、 <httpHandlers>
セクションを構成します。 <Add>
ディレクティブは、トップダウン順に解釈および処理されます。 <httpHandler>
セクション ハンドラーには、次の構文を使用します。
<httpHandlers>
<add verb="[verb list]" path="[path/wildcard]" type="[COM+ Class], [Assembly]" validate="[true/false]" />
<remove verb="[verb list]" path="[path/wildcard]" />
<clear />
</httpHandlers>
HTTP ハンドラーを作成する
HTTP ハンドラーを作成するには、 IHttpHandler
インターフェイスを実装する必要があります。 IHttpHandler
インターフェイスには、次のシグネチャを持つ 1 つのメソッドと 1 つのプロパティがあります。
void ProcessRequest(HttpContext);
bool IsReusable {get;}
Note
HTTP ハンドラーでセッション状態が必要な場合は、 IRequiresSessionState
インターフェイスも実装する必要があります。