次の方法で共有


CHttpModule クラス

要求レベルの HTTP モジュールの基底クラスを定義します。

構文

class CHttpModule  

メソッド

次の表に、 クラスによって公開されるメソッドの一覧を CHttpModule 示します。

名前 説明
~CHttpModule クラスのインスタンスの CHttpModule 割り当てを解除します。
CHttpModule CHttpModule クラスの新しいインスタンスを初期化します。
Dispose CHttpModule クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。
OnAcquireRequestState IIS が現在の要求の状態を AcquireRequestState 取得するときに発生するイベントを処理するメソッドを表します。
OnAsyncCompletion 非同期操作の処理が完了した後に発生する非同期完了イベントを処理するメソッドを表します。
OnAuthenticateRequest IIS がユーザーの ID を確立するときに発生するイベントを処理 AuthenticateRequest するメソッドを表します。
OnAuthorizeRequest IIS がユーザーの承認を検証するときに発生するイベントを AuthorizeRequest 処理するメソッドを表します。
OnBeginRequest 現在の要求の HTTP 統合要求処理パイプラインの最初のイベントとして発生するイベントを処理 BeginRequest するメソッドを表します。
OnCustomRequestNotification モジュールがユーザー定義通知を生成するときに発生するカスタム イベントを処理するメソッドを表します。
OnEndRequest 現在の要求の HTTP 統合要求処理パイプラインの最後のイベントとして発生するイベントを処理 EndRequest するメソッドを表します。
OnExecuteRequestHandler IIS が現在の要求のハンドラーを ExecuteRequestHandler 実行するときに発生するイベントを処理するメソッドを表します。
OnLogRequest IIS が現在の要求をログに LogRequest 記録する準備をするときに発生するイベントを処理するメソッドを表します。
OnMapPath 操作が現在の要求にマップされる物理パスを MapPath 要求したときに発生するイベントを処理するメソッドを表します。
OnMapRequestHandler IIS が現在の要求をイベント ハンドラーに MapRequestHandler マップするときに発生するイベントを処理するメソッドを表します。
OnPostAcquireRequestState IIS が現在の要求の状態を AcquireRequestState 取得した後に発生する、事後イベントを処理するメソッドを表します。
OnPostAuthenticateRequest IIS がユーザーの ID を AuthenticateRequest 確立した後に発生するイベント後を処理するメソッドを表します。
OnPostAuthorizeRequest イベント後を処理するメソッドを AuthorizeRequest 表します。これは、IIS がユーザーの承認を確認した後に発生します。
OnPostBeginRequest イベント後を処理するメソッドを BeginRequest 表します。これは、HTTP 統合要求処理パイプラインの最初のイベントの後に発生します。
OnPostEndRequest 現在の要求の HTTP 統合要求処理パイプラインの最後のイベントの後に発生する、事後イベントを処理 EndRequest するメソッドを表します。
OnPostExecuteRequestHandler イベント後を処理するメソッドを ExecuteRequestHandler 表します。これは、IIS が現在の要求のハンドラーを実行した後に発生します。
OnPostLogRequest IIS が現在の要求をログに記録した後に LogRequest 発生する事後イベントを処理するメソッドを表します。
OnPostMapRequestHandler IIS が現在の要求を適切なイベント ハンドラーに MapRequestHandler マップした後に発生する、事後イベントを処理するメソッドを表します。
OnPostPreExecuteRequestHandler IIS が要求ハンドラーを実行する前に PreExecuteRequestHandler 発生する事後イベントを処理するメソッドを表します。
OnPostReleaseRequestState 現在の状態が解放された後に ReleaseRequestState 発生する事後イベントを処理するメソッドを表します。
OnPostResolveRequestCache IIS がキャッシュからの要求を ResolveRequestCache 解決した後に発生するイベント後を処理するメソッドを表します。
OnPostUpdateRequestCache IIS が要求をキャッシュに UpdateRequestCache 格納した後に発生するイベント後を処理するメソッドを表します。
OnPreExecuteRequestHandler IIS が要求ハンドラーを実行する前に発生するイベントを処理 PreExecuteRequestHandler するメソッドを表します。
OnReadEntity 操作が要求バッファーからデータを ReadEntity 読み取るときに発生するイベントを処理するメソッドを表します。
OnReleaseRequestState 現在の状態が解放されたときに発生するイベントを ReleaseRequestState 処理するメソッドを表します。
OnResolveRequestCache IIS がキャッシュ内の要求を ResolveRequestCache 解決するときに発生するイベントを処理するメソッドを表します。
OnSendResponse IIS が応答バッファーを送信するときに発生するイベントを SendResponse 処理するメソッドを表します。
OnUpdateRequestCache IIS が要求をキャッシュに UpdateRequestCache 格納するときに発生するイベントを処理するメソッドを表します。

派生クラス

このクラスには、派生クラスが含まれています。

解説

クラスは CHttpModule 、要求レベルの HTTP モジュールの基底クラスです。 派生クラスをCHttpModule作成するには、継承元のクラスと IHttpModuleFactory インターフェイスからCHttpModule派生するクラスを含む要求レベルの HTTP モジュールを作成する必要があります。 HTTP モジュールの作成の詳細については、「Native-Code HTTP モジュールの設計」を参照してください。

クラスは CHttpModule 、保護されたコンストラクターとデストラクター メソッドとパブリック Dispose メソッドを提供します。 要求の最後に、 Dispose メソッドが呼び出され、派生クラスのインスタンスが CHttpModule削除されます。

また、 クラスは CHttpModule 、統合された要求処理パイプライン内で要求レベルのイベントを処理するときに IIS 7 が呼び出す通知固有のメソッドも定義します。 HTTP モジュールは、モジュールのエクスポートされた RegisterModule 関数で通知の一覧を定義することで、特定のイベントに登録できます。

決定論的な要求イベント

要求レベルの通知方法の大部分は、統合パイプライン内の要求レベル のイベントの通常のフロー中に時系列的に処理されます。 各決定論的な要求レベルの通知メソッドには、一致するイベント後通知があります。これにより、HTTP モジュールは、イベントが発生したときに、またはイベントが発生した直後に処理できます。

次の表は、時系列の要求レベルのイベントおよびイベント後通知メソッドを、統合パイプライン内で発生した順序で示しています。

イベント通知メソッド イベント後通知メソッド
OnBeginRequest OnPostBeginRequest
OnAuthenticateRequest OnPostAuthenticateRequest
OnAuthorizeRequest OnPostAuthorizeRequest
OnResolveRequestCache OnPostResolveRequestCache
OnMapRequestHandler OnPostMapRequestHandler
OnAcquireRequestState OnPostAcquireRequestState
OnPreExecuteRequestHandler OnPostPreExecuteRequestHandler
OnExecuteRequestHandler OnPostExecuteRequestHandler
OnReleaseRequestState OnPostReleaseRequestState
OnUpdateRequestCache OnPostUpdateRequestCache
OnLogRequest OnPostLogRequest
OnEndRequest OnPostEndRequest

たとえば、 OnBeginRequest は の前にOnAuthenticateRequestOnMapRequestHandler発生し、 は の前にOnAcquireRequestState発生します。

注意

イベント後の通知は、次の時系列要求レベルの通知の前に発生します。 たとえば、 OnPostAuthenticateRequest は の前にOnAuthorizeRequestOnPostUpdateRequestCache発生し、 は の前にOnLogRequest発生します。

非決定的な要求イベント

残りの要求レベルの通知メソッドは、特定の順序で処理されません。代わりに、IIS は特定の非決定的なイベントが発生したときにこれらのイベントを処理します。 次の表に、非決定的な要求レベルのイベントと、イベント後の関連する通知メソッドを示します。

イベント通知メソッド イベント後通知メソッド
OnAsyncCompletion (なし)1
OnCustomRequestNotification (なし)2
OnMapPath (なし)
OnReadEntity (なし)
OnSendResponse (なし)

1 メソッドは OnAsyncCompletion 、HTTP モジュール内で非同期イベントが発生したときに呼び出されます。 そのため、モジュールのエクスポートされた RegisterModule 関数を使用して非同期通知に登録することはできません。 代わりに、非同期的に返されるメソッド (IHttpContext::ExecuteRequest メソッドや IHttpResponse::WriteEntityChunks メソッドなど) を呼び出した後に発生する通知を処理するメソッドがモジュールから提供OnAsyncCompletionされます。 IIS が を呼び出 OnAsyncCompletionすと、 メソッドは、通知の種類と、通知がイベントまたは事後イベントのどちらに対して行われたかを示すパラメーターを渡します。

2 メソッドには OnCustomRequestNotification 、対応するイベント後通知メソッドがありません。 HTTP モジュールは、モジュールのエクスポートされた RegisterModule 関数を使用してカスタム通知に登録できますが、カスタム通知が発生した後に発生する通知にモジュールを登録することはできません。

次の例では、単純な "Hello World" HTTP モジュールを作成する方法を示します。 モジュールは、インターフェイスのIHttpModuleFactoryインスタンスを IHttpModuleRegistrationInfo::SetRequestNotifications メソッドに渡し、RQ_BEGIN_REQUEST通知に登録するエクスポートされたRegisterModule関数を定義します。 IIS では 、IHttpModuleFactory::GetHttpModule メソッドを使用してクラスのインスタンスを CHttpModule 作成し、成功状態を返します。 IIS では、 IHttpModuleFactory::Terminate メソッドを使用してメモリからファクトリを削除します。

通知が RQ_BEGIN_REQUEST 発生すると、IIS はモジュールの メソッドを呼び出して現在の OnBeginRequest 要求を処理します。 OnBeginRequest は応答バッファーをクリアし、応答の MIME の種類を変更します。 次に、 メソッドは、"Hello World" 文字列を含むデータ チャンクを作成し、その文字列を Web クライアントに返します。 最後に、モジュールは、すべての通知が完了し、終了したことを IIS に通知する状態インジケーターを返します。

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// Create the module class.
class CHelloWorld : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS
    OnBeginRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pProvider );

        // Create an HRESULT to receive return values from methods.
        HRESULT hr;
        
        // Retrieve a pointer to the response.
        IHttpResponse * pHttpResponse = pHttpContext->GetResponse();

        // Test for an error.
        if (pHttpResponse != NULL)
        {
            // Clear the existing response.
            pHttpResponse->Clear();
            // Set the MIME type to plain text.
            pHttpResponse->SetHeader(
                HttpHeaderContentType,"text/plain",
                (USHORT)strlen("text/plain"),TRUE);

            // Create a string with the response.
            PCSTR pszBuffer = "Hello World!";
            // Create a data chunk.
            HTTP_DATA_CHUNK dataChunk;
            // Set the chunk to a chunk in memory.
            dataChunk.DataChunkType = HttpDataChunkFromMemory;
            // Buffer for bytes written of data chunk.
            DWORD cbSent;
            
            // Set the chunk to the buffer.
            dataChunk.FromMemory.pBuffer =
                (PVOID) pszBuffer;
            // Set the chunk size to the buffer size.
            dataChunk.FromMemory.BufferLength =
                (USHORT) strlen(pszBuffer);
            // Insert the data chunk into the response.
            hr = pHttpResponse->WriteEntityChunks(
                &dataChunk,1,FALSE,TRUE,&cbSent);

            // Test for an error.
            if (FAILED(hr))
            {
                // Set the HTTP status.
                pHttpResponse->SetStatus(500,"Server Error",0,hr);
            }

            // End additional processing.
            return RQ_NOTIFICATION_FINISH_REQUEST;
        }

        // Return processing to the pipeline.
        return RQ_NOTIFICATION_CONTINUE;
    }
};

// Create the module's class factory.
class CHelloWorldFactory : public IHttpModuleFactory
{
public:
    HRESULT
    GetHttpModule(
        OUT CHttpModule ** ppModule, 
        IN IModuleAllocator * pAllocator
    )
    {
        UNREFERENCED_PARAMETER( pAllocator );

        // Create a new instance.
        CHelloWorld * pModule = new CHelloWorld;

        // Test for an error.
        if (!pModule)
        {
            // Return an error if the factory cannot create the instance.
            return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
        }
        else
        {
            // Return a pointer to the module.
            *ppModule = pModule;
            pModule = NULL;
            // Return a success status.
            return S_OK;
        }            
    }

    void
    Terminate()
    {
        // Remove the class from memory.
        delete this;
    }
};

// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
    DWORD dwServerVersion,
    IHttpModuleRegistrationInfo * pModuleInfo,
    IHttpServer * pGlobalInfo
)
{
    UNREFERENCED_PARAMETER( dwServerVersion );
    UNREFERENCED_PARAMETER( pGlobalInfo );

    // Set the request notifications and exit.
    return pModuleInfo->SetRequestNotifications(
        new CHelloWorldFactory,
        RQ_BEGIN_REQUEST,
        0
    );
}

モジュールで 関数をエクスポートする RegisterModule 必要があります。 この関数をエクスポートするには、プロジェクトのモジュール定義 (.def) ファイルを作成するか、スイッチを使用してモジュールを /EXPORT:RegisterModule コンパイルします。 詳細については、「 チュートリアル: ネイティブ コードを使用したRequest-Level HTTP モジュールの作成」を参照してください。

必要に応じて、各関数の呼び出し規約を __stdcall (/Gz) 明示的に宣言するのではなく、呼び出し規約を使用してコードをコンパイルできます。

要件

Type 説明
Client - Windows Vista 上の IIS 7.0
- Windows 7 上の IIS 7.5
- Windows 8 の IIS 8.0
- Windows 10の IIS 10.0
サーバー - Windows Server 2008 の IIS 7.0
- Windows Server 2008 R2 上の IIS 7.5
- Windows Server 2012 上の IIS 8.0
- Windows Server 2012 R2 上の IIS 8.5
- Windows Server 2016上の IIS 10.0
製品 - IIS 7.0、IIS 7.5、IIS 8.0、IIS 8.5、IIS 10.0
- IIS Express 7.5、IIS Express 8.0、IIS Express 10.0
Header Httpserv.h

参照

Native-Code HTTP モジュールの作成
CGlobalModule クラス