次の方法で共有


Native-Code HTTP モジュールの設計

IIS 7 の HTTP モジュールを使用すると、開発者は IIS のコア機能を拡張または置き換えることができます。 たとえば、IIS 7 に含まれるモジュールを置き換えるダイジェスト認証モジュールを記述できます。 ネイティブ コード モジュールによって提供される機能の一部は、以前 ISAPI フィルターで使用できた機能に似ている場合がありますが、ネイティブ コード モジュールは異なる方法で設計され、ISAPI フィルターよりもはるかに豊富な機能セットを提供します。

Native-Code HTTP モジュールの要件

エクスポートされた登録関数の追加

RegisterModule 関数をエクスポートするには、HTTP モジュールが必要です。 この関数をエクスポートするには、プロジェクトのモジュール定義 (.def) ファイルを作成するか、 /EXPORT:RegisterModule スイッチを使用してモジュールをコンパイルします。

通知とモジュールの優先順位の指定

RegisterModule関数を作成するときに、要求レベルのモジュールが処理する通知の一覧を含むビットマスクを指定します (詳細については、「Request-Processing 定数」を参照してください)。 たとえば、要求レベルのモジュールでは、RQ_BEGIN_REQUEST通知とRQ_MAP_PATH後通知を処理するメソッドを提供するように指定できます。 同様に、グローバル レベルのモジュールでは、 GL_APPLICATION_STARTGL_APPLICATION_STOP 通知を処理するメソッドを提供するように指定できます。

RegisterModule関数を使用すると、モジュールの優先順位を指定することもできます。 使用可能な優先順位は、 PRIORITY_ALIAS_FIRSTPRIORITY_ALIAS_HIGHPRIORITY_ALIAS_MEDIUMPRIORITY_ALIAS_LOW、および PRIORITY_ALIAS_LASTです。 モジュールが登録されると、優先順位と構成設定の順序で処理されます。 たとえば、中優先度モジュールとして登録する HTTP モジュールを作成した場合、すべての優先度の高いモジュールが処理されるまで、モジュールは処理されません。 他の中優先度モジュールの前に処理されるようにモジュールを構成できます。また、モジュールは優先度の低いモジュールの前に処理されます。

RQ_SEND_RESPONSE通知では、優先度レベルの順序が逆になります。

Request-Level モジュールの作成

モジュール ファクトリの作成

ネイティブ コード要求レベルのモジュールは、 CHttpModule クラスのインスタンスを作成するモジュール ファクトリを提供する必要があります。 モジュール ファクトリは IHttpModuleFactory インターフェイスから継承されます。

モジュール ファクトリを作成する方法の詳細については、「 チュートリアル: ネイティブ コードを使用した Request-Level HTTP モジュールの作成」のコード例を参照してください。

CHttpModule から派生したクラスの作成

要求レベルの HTTP モジュールの主な処理機能は、基本 CHttpModule クラスから派生したモジュールを介して提供されます。 このクラスには、 RegisterModule 関数にリストされている各通知または通知後のコールバック メソッドが含まれている必要があります。 たとえば、 モジュールがRQ_AUTHENTICATE_REQUEST 通知と RQ_AUTHORIZE_REQUEST 後通知に登録されている場合、クラスには OnAuthenticateRequest メソッドと OnPostAuthorizeRequest メソッドが含まれている必要があります。

CHttpModule メソッドからの返し

CHttpModule クラスのメソッドの処理が完了したら、各メソッドはREQUEST_NOTIFICATION_STATUS列挙値を返す必要があります。 この値は、IIS がクラス メソッドの終了条件を処理する方法を決定します。 たとえば、 RQ_NOTIFICATION_CONTINUE の戻り値は、要求の処理を続行するように IIS に通知します。 これに対し、戻り値 RQ_NOTIFICATION_FINISH_REQUEST は、現在の要求の処理を停止するように IIS に指示します。

CHttpModule のクリーンアップ

モジュールの処理が完了すると、IIS はモジュールの CHttpModule::D ispose メソッドを呼び出して、 CHttpModule クラスをメモリから削除します。

グローバルレベルのモジュールの作成

CGlobalModule から派生したクラスの作成

グローバル レベルの HTTP モジュールの主な処理機能は、基本 CGlobalModule クラスから派生したモジュールを介して提供されます。 このクラスには、 RegisterModule 関数にリストされている各通知のコールバック メソッドが含まれている必要があります。 たとえば、 モジュールがGL_APPLICATION_START および GL_APPLICATION_STOP 通知に登録されている場合、クラスには OnGlobalApplicationStart メソッドと OnGlobalApplicationStop メソッドが 含まれている必要があります。

CGlobalModule メソッドからの戻り値

CGlobalModule クラスのメソッドの処理が完了したら、各メソッドはGLOBAL_NOTIFICATION_STATUS列挙値を返す必要があります。 この値は、IIS がクラス メソッドの終了条件を処理する方法を決定します。 たとえば、 GL_NOTIFICATION_CONTINUEの戻 り値は、通知の処理を続行するように IIS に通知します。 これに対し、戻り値 GL_NOTIFICATION_HANDLED は、現在の通知の処理を停止するように IIS に指示します。

CGlobalModule のクリーンアップ

モジュールの処理が完了すると、IIS はモジュールの CGlobalModule::Terminate メソッドを呼び出します。 モジュールでは、このメソッドを使用して、 CGlobalModule クラスをメモリから削除する必要があります。

こちらもご覧ください

チュートリアル: ネイティブ コードを使用した Request-Level HTTP モジュールの作成
チュートリアル: ネイティブ コードを使用した Global-Level HTTP モジュールの作成
Native-Code HTTP モジュールの作成