IHttpModuleFactory::GetHttpModule 메서드

CHttpModule 클래스의 instance 만듭니다.

구문

virtual HRESULT GetHttpModule(  
   OUT CHttpModule** ppModule,  
   IN IModuleAllocator* pAllocator  
) = 0;  

매개 변수

ppModule
[OUT] CHttpModule 클래스에 대한 역참조 포인터입니다.

pAllocator
[IN] IModuleAllocator 인터페이스에 대한 포인터입니다.

반환 값

HRESULT입니다. 가능한 값에는 다음 표에 있는 값이 포함되지만, 이에 국한되는 것은 아닙니다.

설명
S_OK 작업이 성공했음을 나타냅니다.

참고

모듈 팩터리는 메서드를 제공해야 GetHttpModule 하므로 반환 값에 대한 상태 코드를 애플리케이션에 적절하게 제공할 수 있습니다. 최소한 메서드는 GetHttpModule 성공적으로 완료되었음을 나타내기 위해 S_OK 반환해야 합니다.

설명

IHttpModuleFactory 인터페이스는 클래스의 CHttpModule instance 만드는 메서드를 제공해야 GetHttpModule 합니다. IIS가 모듈의 내보낸 RegisterModule 함수를 호출하면 IIS는 모듈 팩터리의 GetHttpModule 메서드를 사용하여 클래스의 CHttpModule instance 만듭니다.

예제

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

알림이 RQ_BEGIN_REQUEST 트리거되면 IIS는 모듈의 CHttpModule::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

참고 항목

CHttpModule 클래스
IHttpModuleFactory 인터페이스
Native-Code HTTP 모듈 디자인
연습: 네이티브 코드를 사용하여 Request-Level HTTP 모듈 만들기