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_START と GL_APPLICATION_STOP 通知を処理するメソッドを提供するように指定できます。
RegisterModule関数を使用すると、モジュールの優先順位を指定することもできます。 使用可能な優先順位は、 PRIORITY_ALIAS_FIRST、 PRIORITY_ALIAS_HIGH、 PRIORITY_ALIAS_MEDIUM、 PRIORITY_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 モジュールの作成