다음을 통해 공유


CHttpModule 클래스

요청 수준 HTTP 모듈에 대한 기본 클래스를 정의합니다.

구문

class CHttpModule  

메서드

다음 표에서는 클래스에서 노출하는 메서드를 나열합니다 CHttpModule .

속성 Description
~CHttpModule 클래스의 instance 할당을 취소합니다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 IIS에서 사용자 권한 부여를 AuthorizeRequest 확인한 후에 발생하는 사후 이벤트를 처리할 메서드를 나타냅니다.
OnPostBeginRequest HTTP 통합 요청 처리 파이프라인의 BeginRequest 첫 번째 이벤트 이후에 발생하는 사후 이벤트를 처리할 메서드를 나타냅니다.
OnPostEndRequest 현재 요청에 대한 HTTP 통합 요청 처리 파이프라인의 마지막 이벤트 이후에 발생하는 사후 이벤트를 처리 EndRequest 할 메서드를 나타냅니다.
OnPostExecuteRequestHandler IIS가 현재 요청에 대한 처리기를 실행한 ExecuteRequestHandler 후에 발생하는 사후 이벤트를 처리할 메서드를 나타냅니다.
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만들려면 에서 상속 CHttpModule 되는 클래스와 IHttpModuleFactory 인터페이스에서 파생되는 클래스가 포함된 요청 수준 HTTP 모듈을 만들어야 합니다. HTTP 모듈을 만드는 방법에 대한 자세한 내용은 Native-Code HTTP 모듈 디자인을 참조하세요.

클래스는 CHttpModule 보호된 생성자 및 소멸자 메서드와 public Dispose 메서드를 제공합니다. 요청이 끝나면 메서드가 Dispose 호출되어 파생 클래스의 CHttpModuleinstance 삭제합니다.

또한 클래스는 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::ExecuteRequestIHttpResponse::WriteEntityChunks 메서드)를 호출한 후 발생하는 알림을 처리하는 메서드를 제공합니다OnAsyncCompletion. IIS가 를 호출 OnAsyncCompletion하면 메서드는 알림 유형과 알림이 이벤트 또는 사후 이벤트에 대한 것인지 여부를 나타내는 매개 변수를 전달합니다.

2 메서드에 OnCustomRequestNotification 해당 이벤트 후 알림 메서드가 없습니다. HTTP 모듈은 모듈의 내보낸 RegisterModule 함수를 사용하여 사용자 지정 알림을 등록할 수 있지만 사용자 지정 알림이 발생한 후에 발생하는 알림에 대해 모듈을 등록할 수 없습니다.

예제

다음 예제에서는 간단한 "헬로 월드" HTTP 모듈을 만드는 방법을 보여 줍니다. 모듈은 인터페이스의 IHttpModuleFactory instance IHttpModuleRegistrationInfo::SetRequestNotifications 메서드에 전달하고 RQ_BEGIN_REQUEST 알림에 등록하는 RegisterModule 보낸 함수를 정의합니다. IIS는 IHttpModuleFactory::GetHttpModule 메서드를 사용하여 클래스의 CHttpModule instance 만들고 성공 상태 반환합니다. 또한 IIS는 IHttpModuleFactory::Terminate 메서드를 사용하여 메모리에서 팩터리를 제거합니다.

알림이 RQ_BEGIN_REQUEST 발생하면 IIS는 모듈의 OnBeginRequest 메서드를 호출하여 현재 요청을 처리합니다. OnBeginRequest 는 응답 버퍼를 지우고 응답에 대한 MIME 형식을 수정합니다. 그런 다음 메서드는 "헬로 월드" 문자열을 포함하는 데이터 청크를 만들고 문자열을 웹 클라이언트에 반환합니다. 마지막으로 모듈은 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) 코드를 컴파일할 수 있습니다.

요구 사항

형식 Description
클라이언트 - 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
헤더 Httpserv.h

참고 항목

Native-Code HTTP 모듈 만들기
CGlobalModule 클래스