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_STARTGL_APPLICATION_STOP 通知を処理するメソッドを提供するように指定できます。

この RegisterModule 関数を使用すると、モジュールの優先度を指定することもできます。 使用可能な優先順位は、PRIORITY_ALIAS_FIRST、、PRIORITY_ALIAS_HIGHPRIORITY_ALIAS_LOWPRIORITY_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 モジュールの作成