HTTP ハンドラと HTTP モジュールの概要

Visual Studio 2010

更新 : 2007 年 11 月

ASP.NET HTTP ハンドラは、ASP.NET Web アプリケーションに対して行われた要求に応答して実行されるプロセス ("終了点" とも呼ばれます) です。このハンドラの中で最もよく使用されるのが、.aspx ファイルを処理する ASP.NET ページ ハンドラです。ユーザーが .aspx ファイルを要求すると、その要求はこのページ ハンドラ経由でページによって処理されます。独自の HTTP ハンドラを作成すると、カスタムの出力をブラウザに描画できます。

HTTP モジュールは、アプリケーションに対して要求が行われるたびに呼び出されるアセンブリです。HTTP モジュールは ASP.NET の要求パイプラインの一部として呼び出され、要求が行われている間、有効期間イベントにアクセスします。HTTP モジュールを使用することにより、着信要求と送信要求をチェックし、要求に応じた処理を行うことができます。

このトピックの内容は次のとおりです。

HTTP ハンドラの一般的な使用法を次に示します。

  • RSS フィード   Web サイトの RSS フィードを作成するために、RSS 形式の XML を生成するハンドラを作成できます。そのうえで、.rss などのファイル名拡張子をカスタム ハンドラにバインドします。この場合、ユーザーが .rss で終了するサイトに対して要求を送信すると、ASP.NET はハンドラを呼び出して要求を処理します。

  • イメージ サーバー   Web アプリケーションでさまざまなサイズのイメージを処理する必要がある場合、イメージのサイズを変更し、これらをハンドラの応答としてユーザーに返すカスタム ハンドラを作成できます。

HTTP モジュールの一般的な使用法を次に示します。

  • セキュリティ   着信要求をチェックできるため、HTTP モジュールを使用して、要求されたページ、XML Web サービス、またはハンドラが呼び出される前にカスタム認証やその他のセキュリティ チェックを実行できます。統合モードで実行されている Internet Information Services (IIS) 7.0 では、フォーム認証をアプリケーション内のすべての種類のコンテンツに拡張できます。

  • 統計情報とログ   HTTP モジュールは要求ごとに呼び出されるため、個々のページではなく、中心となる 1 つのモジュールで要求の統計情報とログ情報を収集できます。

  • カスタムのヘッダーまたはフッター   送信応答を変更できるため、カスタム ヘッダー情報などのコンテンツを、ページごとまたは XML Web サービス応答ごとに挿入できます。

ページのトップへ

HTTP ハンドラと HTTP モジュールの機能を次に示します。

  • IHttpHandler インターフェイスと IHttpModule インターフェイスは、ハンドラおよびモジュールを開発するときの開始点です。

  • IHttpAsyncHandler インターフェイスは、非同期ハンドラを開発するときの開始点です。

  • カスタムのハンドラおよびモジュールは、ソース コードをアプリケーションの App_Code フォルダに保存するか、コンパイルしたものをアプリケーションの Bin フォルダに保存できます。

  • IIS 6.0 向けに開発されたハンドラおよびモジュールは、ほとんど変更せずに IIS 7.0 で使用できます。詳細については、「IIS 6.0 から IIS 7.0 への ASP.NET アプリケーションの移行」を参照してください。

  • モジュールでは、さまざまな要求パイプライン通知をサブスクライブできます。モジュールでは、HttpApplication オブジェクトのイベントの通知を受信できます。

  • IIS 7.0 では、要求パイプラインが Web サーバーの要求パイプラインと統合されています。このため、ASP.NET に対する要求だけでなく、Web サーバーに対するすべての要求に HTTP モジュールを使用できます。

ページのトップへ

HTTP ハンドラ

ASP.NET HTTP ハンドラは、ASP.NET Web アプリケーションに対して行われた要求に応答して実行されるプロセスです。このハンドラの中で最もよく使用されるのが、.aspx ファイルを処理する ASP.NET ページ ハンドラです。ユーザーが .aspx ファイルを要求すると、その要求はこのページ ハンドラによって処理されます。

ASP.NET ページ ハンドラは 1 種類だけのハンドラです。ASP.NET には、.asmx ファイル用の Web サービス ハンドラなど、他の組み込みハンドラも用意されています。

ASP.NET の組み込み HTTP ハンドラ

ASP.NET は、ファイル名拡張子に基づいて HTTP 要求を HTTP ハンドラに割り当てます。各 HTTP ハンドラでは、アプリケーション内の各 HTTP URL または URL 拡張子のグループを処理できます。ASP.NET には、次の表に示す組み込み HTTP ハンドラが含まれます。

Handler

説明

ASP.NET ページ ハンドラ (*.aspx)

すべての ASP.NET ページに対する既定の HTTP ハンドラ。

Web サービス ハンドラ (*.asmx)

ASP.NET で .asmx ファイルとして作成された Web サービス ページに対する既定の HTTP ハンドラ。

汎用の Web ハンドラ (*.ashx)

UI を持たず、@ WebHandler ディレクティブを含むすべての Web ハンドラに対する既定の HTTP ハンドラ。

トレース ハンドラ (trace.axd)

現在のページ トレース情報を表示するハンドラ。詳細については、「方法 : トレース ビューアで ASP.NET トレース情報を表示する」を参照してください。

カスタム HTTP ハンドラの作成

カスタムの同期 HTTP ハンドラを作成するには、IHttpHandler インターフェイスを実装するクラスを作成します。または、IHttpAsyncHandler を実装すると、非同期ハンドラを作成できます。どちらのハンドラ インターフェイスでも、IsReusable プロパティと ProcessRequest メソッドを実装する必要があります。IsReusable プロパティは、パフォーマンスの向上のために、IHttpHandlerFactory オブジェクト (該当するハンドラを実際に呼び出すオブジェクト) がハンドラをプールに追加して再利用できるかどうかを指定します。ハンドラをプールに追加できない場合、ハンドラが必要になるたびにファクトリでハンドラの新しいインスタンスを作成する必要があります。

個々の HTTP 要求は、ProcessRequest メソッドによって処理されます。このメソッド内に、ハンドラの出力を生成するコードを記述します。

HTTP ハンドラは、アプリケーション コンテキストにアクセスします。これには、要求の送信元ユーザーの ID (わかっている場合)、アプリケーションの状態、およびセッション情報が含まれます。HTTP ハンドラが要求されると、ASP.NET は、適切なハンドラの ProcessRequest メソッドを呼び出します。次に、ハンドラの ProcessRequest メソッド内に記述したコードが応答を作成し、この応答が要求元のブラウザに返されます。

ファイル名拡張子の割り当て

クラス ファイルを HTTP ハンドラとして作成すると、IIS および ASP.NET でまだ割り当てられていないファイル名拡張子にそのハンドラで応答できます。たとえば、RSS フィードを生成する HTTP ハンドラを作成する場合、ハンドラを .rss ファイル名拡張子に割り当てることができます。ASP.NET がカスタムのファイル名拡張子に対してどのハンドラを使用するか判断できるようにするには、IIS でその拡張子を ASP.NET に割り当てる必要があります。さらに、アプリケーションで、その拡張子をカスタム ハンドラに割り当てる必要があります。

既定では、ASP.NET は、ファイル名拡張子 .ashx を HTTP ハンドラに割り当てます。@ WebHandler ディレクティブをクラス ファイルに追加すると、ASP.NET は自動的に .ashx ファイル拡張子を既定の HTTP ハンドラに割り当てます。これは、@ Page ディレクティブが使用された場合に、ASP.NET が .aspx ファイル名拡張子を ASP.NET ページ ハンドラに割り当てるのと似ています。したがって、ファイル名拡張子 .ashx を持つ HTTP ハンドラ クラスを作成した場合、ハンドラは IIS と ASP.NET に自動的に登録されます。

ハンドラのカスタムのファイル名拡張子を作成するには、IIS および ASP.NET で、明示的にその拡張子を登録する必要があります。.ashx ファイル名拡張子を使用しないことの利点は、ハンドラを後から別の拡張子割り当てに再利用できる点です。たとえば、あるアプリケーションでは、カスタム ハンドラで末尾に .rss が付く要求に応答するとします。別のアプリケーションでは、このハンドラで末尾に .feed が付く要求に応答できます。また、同じアプリケーション上でハンドラをこれら 2 つのファイル名拡張子に割り当て、拡張子に合わせて異なる応答を作成することもできます。

ハンドラのカスタムのファイル名拡張子を登録する手順は、IIS 7.0 と以前のバージョンの IIS とで異なります。詳細については、「方法 : HTTP ハンドラを登録する」および「方法 : IIS で HTTP ハンドラ拡張子を構成する」を参照してください。

非同期 HTTP ハンドラと同期 HTTP ハンドラ

HTTP ハンドラは、同期ハンドラとしても非同期ハンドラとしても使用できます。同期ハンドラは、そのハンドラが呼び出されたときの HTTP 要求の処理が完了するまで制御を戻しません。非同期ハンドラは、独立して、ユーザーに応答を送信するプロセスを実行します。非同期ハンドラは、時間がかかる可能性のあるアプリケーション プロセスを起動する必要があり、プロセスが終了するまで待たなくてもユーザーがサーバーから応答を受け取ることができるようにする場合に役立ちます。

非同期 HTTP ハンドラを使用すると、リモート サーバーに対するメソッド呼び出しなどの外部プロセスを開始できます。ハンドラは、外部プロセスが終了するのを待たずに処理を続行できます。非同期 HTTP ハンドラの処理中、ハンドラが外部プロセスからコールバックを受け取るまで、ASP.NET は、通常であれば外部プロセスが使用するスレッドをスレッド プール内に戻します。一度に実行できるスレッドの数には制限があるため、これにより、スレッドのブロックが防止され、パフォーマンスが向上します。外部プロセスに依存する同期 HTTP ハンドラを多くのユーザーが要求した場合には、多くのスレッドがブロックされて外部プロセスを待機するため、オペレーティング システムでスレッドが不足する可能性があります。

非同期ハンドラを作成するときは、IHttpAsyncHandler インターフェイスを実装する必要があります。また、個々の HTTP 要求を処理する非同期呼び出しを開始するために、BeginProcessRequest メソッドを実装する必要もあります。さらに、プロセスの終了時にクリーンアップ コードを実行する EndProcessRequest メソッドを実装する必要もあります。

カスタム IHttpHandlerFactory クラス

IHttpHandlerFactory クラスは要求を受け取り、適切な HTTP ハンドラに要求を転送します。IHttpHandlerFactory インターフェイスを実装するクラスを作成することにより、カスタム HTTP ハンドラ ファクトリを作成できます。カスタム ハンドラ ファクトリを作成すると、実行時の状態に基づいて異なるハンドラを生成することにより、HTTP 要求の処理をより細かく制御できます。たとえば、カスタム HTTP ハンドラ ファクトリを使用すると、HTTP 要求メソッドが PUT である場合と GET である場合とで、ファイルの種類に合わせて個別の HTTP ハンドラをインスタンス化できます。

ハンドラ ファクトリのカスタムの拡張子を登録するには、ハンドラのカスタムの拡張子を登録する手順に従います。ハンドラ ファクトリを作成および登録する例については、「チュートリアル : HTTP ハンドラ ファクトリの作成と登録」を参照してください。

HTTP モジュール

HTTP モジュールは、アプリケーションに対して要求が行われるたびに呼び出されるアセンブリです。HTTP モジュールは要求パイプラインの一部として呼び出され、要求が行われている間、有効期間イベントにアクセスします。したがって、HTTP モジュールを使用することにより、着信要求をチェックし、要求に応じた処理を行うことができます。また、送信応答をチェックして変更することもできます。

IIS 6.0 では、ASP.NET の要求パイプラインは Web サーバーの要求パイプラインとは分離されます。IIS 7.0 では、ASP.NET の要求パイプラインと Web サーバーの要求パイプラインを、共通の要求パイプラインに統合できます。IIS 7.0 では、これを統合モードと呼びます。パイプラインを統合することで、ASP.NET 開発者はいくつかのメリットを享受できます。たとえば、要求が ASP.NET のリソースに対するものでなくても、すべての要求について、マネージ コード モジュールでパイプライン通知を受け取ることができます。しかし、必要に応じて IIS 7.0 をクラシック モードで実行し、IIS 6.0 での ASP.NET の動作をエミュレートすることもできます。詳細については、「IIS 7.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

ASP.NET HTTP モジュールは、すべての要求について起動されるため、ISAPI フィルタと似ています。ただし、ASP.NET HTTP モジュールはマネージ コードで記述され、ASP.NET アプリケーションの有効期間に完全に統合されます。カスタム モジュールを保存するには、ソース コードをアプリケーションの App_Code フォルダに保存するか、コンパイルしたものをアセンブリとしてアプリケーションの Bin フォルダに保存します。

ASP.NET では、モジュールを使用して、フォーム認証、キャッシュ、セッション状態、クライアント スクリプト サービスなどのさまざまなアプリケーション機能を実装します。いずれの場合でも、これらのサービスを有効にすると、モジュールが要求の一部として呼び出され、1 ページの要求の範囲外のタスクが実行されます。各モジュールはアプリケーション イベントを処理し、Global.asax ファイルで処理できるイベントを発生させます。アプリケーション イベントの詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」および「IIS 7.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

Bb398986.alert_note(ja-jp,VS.100).gifメモ :

HTTP モジュールは HTTP ハンドラとは異なります。HTTP ハンドラは、ファイル名拡張子またはファイル名拡張子のファミリによって識別される要求に対して応答を返します。一方、HTTP モジュールは、すべての要求および応答について呼び出されます。HTTP モジュールは、要求パイプライン内のイベント通知をサブスクライブし、登録されたイベント ハンドラ内でコードを実行できるようにします。モジュールを使用して実行するタスクは、アプリケーション全体、およびアプリケーション内のリソースに対するすべての要求に関係するものです。

HTTP モジュールのしくみ

モジュールで要求パイプラインから通知を受け取るには、そのモジュールを登録する必要があります。HTTP モジュールの最も一般的な登録方法は、アプリケーションの Web.config ファイルを使用することです。IIS 7.0 では、要求パイプラインが統合されているため、IIS マネージャや Appcmd.exe コマンド ライン ツールなどの他の方法でもモジュールを登録できます。詳細については、「Configuring Handler Mappings in IIS 7.0」および「Start Appcmd.exe」を参照してください。

アプリケーションを表す HttpApplication クラスのインスタンスを ASP.NET が作成するときに、登録されているすべてのモジュールのインスタンスが作成されます。モジュールの作成時に、その Init メソッドが呼び出され、モジュールが自身を初期化します。詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」および「IIS 7.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

モジュールの Init メソッドでは、モジュール内のメソッドにイベントをバインドすることにより、さまざまなアプリケーション イベント (BeginRequestEndRequest など) をサブスクライブできます。

Bb398986.alert_note(ja-jp,VS.100).gifメモ :

IIS 7.0 の統合パイプラインで動作するモジュールの場合は、Init メソッド内でイベント ハンドラを登録する必要があります。

アプリケーション イベントが発生すると、モジュール内の該当するメソッドが呼び出されます。このメソッドでは、認証のチェックや要求情報のログなど、必要な任意のロジックを実行できます。モジュールは、イベント処理の間、現在の要求の Context プロパティにアクセスします。その結果、他のページへの要求のリダイレクト、要求の変更、またはその他の要求操作を実行できるようになります。たとえば、モジュールで認証チェックを行う場合、資格情報が正しくないときにはログイン ページまたはエラー ページにリダイレクトできます。また、モジュールのイベント ハンドラの実行が終了すると、ASP.NET はパイプライン内の次の処理を呼び出します。この処理は、他のモジュールである場合や、要求に対応する HTTP ハンドラ (.aspx ファイルなど) である場合があります。

HTTP モジュールと Global.asax ファイル

モジュールのほとんどの機能は Global.asax ファイル内に実装できます。このファイルによって、アプリケーション イベントに応答できます。ただし、Global.asax に比べてモジュールには、カプセル化でき、一度作成すると多数の異なるアプリケーションで使用できるという利点があります。モジュールをグローバル アセンブリ キャッシュに追加し、Machine.config ファイルに登録すると、アプリケーション間で再利用できるようになります。詳細については、「グローバル アセンブリ キャッシュ」を参照してください。

Bb398986.alert_note(ja-jp,VS.100).gifメモ :

IIS 7.0 では、パイプラインを統合することで、ASP.NET のリソースに対する要求だけでなく、すべての要求についてマネージ モジュールでパイプライン通知をサブスクライブできます。Global.asax ファイルのイベント ハンドラが呼び出されるのは、アプリケーション内のリソースに対する要求の発生時に通知を受け取ったときだけです。統合モードでは、カスタム モジュールのスコープを明示的に設定することにより、アプリケーションに対する要求についてのみイベント通知を受け取ることができます。統合モード以外では、カスタム モジュールはアプリケーションに対するすべての要求についてイベント通知を受け取ります。modules セクションの add 要素の precondition 属性を "managedHandler" に設定すると、モジュールのスコープがアプリケーションに設定されます。

Global.asax ファイルを使用する利点は、Session_StartSession_End など、他の登録されたイベントを処理できることです。また、Global.asax ファイルを使用して、アプリケーション全体で使用できるグローバル オブジェクトのインスタンスを作成することもできます。

アプリケーション イベントに依存するコードを作成する必要がある場合、および次の条件が満たされる場合は、モジュールを使用します。

  • モジュールを他のアプリケーションで再利用する場合。

  • Global.asax ファイルに複雑なコードを記述したくない場合。

  • モジュールがパイプライン内のすべての要求に適用される場合 (IIS 7.0 の統合モードのみ)。

アプリケーション イベントに依存するコードを作成する必要があり、そのコードを複数のアプリケーションで再利用する必要がない場合は、Global.asax ファイルにコードを追加します。また、モジュールでは使用できないイベント (Session_Start など) をサブスクライブする必要がある場合も、Global.asax を使用します。

HTTP モジュールの作成

HTTP モジュールを作成するための一般的な手順は次のとおりです。

  • IHttpModule インターフェイスを実装するクラスを作成します。

  • Init メソッドのハンドラを記述します。初期化メソッドでは、モジュールを初期化し、必要なアプリケーション イベントをサブスクライブする必要があります。たとえば、応答に何か追加する必要がある場合は、EndRequest イベントをサブスクライブします。また、カスタムの認証ロジックを実行する必要がある場合は、AuthenticateRequest イベントをサブスクライブします。アプリケーション イベントの詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

  • サブスクライブしたイベントに対応するコードを記述します。

  • モジュールをクリーンアップする必要がある場合は、オプションで Dispose メソッドを実装します。

  • Web.config ファイル内にモジュールを登録します。詳細については、「チュートリアル : カスタム HTTP モジュールを作成および登録する」を参照してください。

IIS 6.0 またはそれ以前のバージョンの IIS で実行されるアプリケーションから、IIS 7.0 で実行されるアプリケーションにモジュールを移行する方法については、「IIS 6.0 から IIS 7.0 への ASP.NET アプリケーションの移行」を参照してください。

ページのトップへ

次の表は、HTTP モジュールと HTTP ハンドラに関する主要なサーバー クラスの一覧です。

クラス

説明

IHttpModule

このインターフェイスを実装して Web.config ファイルにモジュールを登録することにより、カスタム HTTP モジュールを作成するために使用します。

IHttpHandler

このインターフェイスを実装するクラスを作成することにより、カスタムの同期 HTTP ハンドラを作成するために使用します。

IHttpAsyncHandler

このインターフェイスを実装するクラスを作成することにより、カスタムの非同期 HTTP ハンドラを作成するために使用します。

ページのトップへ

表示: