Native-Code HTTP モジュールの設計
IIS 7 の HTTP モジュールを使用すると、開発者は IIS のコア機能を拡張または置き換えることができます。 たとえば、IIS 7 に含まれているモジュールを置き換えるダイジェスト認証モジュールを記述できます。 ネイティブ コード モジュールによって提供される機能の一部は、以前は ISAPI フィルターで使用されていた機能に似ている場合がありますが、ネイティブ コード モジュールは異なる方法で設計され、ISAPI フィルターよりもはるかに豊富な機能セットを提供します。
Native-Code HTTP モジュールの要件
エクスポートされた登録関数の追加
RegisterModule 関数をエクスポートするには、HTTP モジュールが必要です。 この関数をエクスポートするには、プロジェクトのモジュール定義 (.def) ファイルを作成するか、 /EXPORT:RegisterModule スイッチを使用してモジュールをコンパイルします。
通知とモジュールの優先度の指定
関数を RegisterModule
作成するときに、要求レベル モジュールが処理する通知の一覧を含むビットマスクを指定します (詳細については、「 要求処理定数」を参照してください)。 たとえば、要求レベルのモジュールでは、RQ_BEGIN_REQUEST通知とRQ_MAP_PATH事後通知を処理するメソッドを提供するように指定できます。 同様に、グローバル レベルのモジュールでは、 GL_APPLICATION_START と GL_APPLICATION_STOP 通知を処理するメソッドを提供するように指定できます。
この RegisterModule
関数を使用すると、モジュールの優先度を指定することもできます。 使用可能な優先順位は、PRIORITY_ALIAS_FIRST
、、PRIORITY_ALIAS_HIGH
、PRIORITY_ALIAS_LOW
PRIORITY_ALIAS_MEDIUM
、および です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
メモリから削除します。
Global-Level モジュールの作成
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 モジュールの作成