IHttpContext::NotifyCustomNotification 메서드

사용자 지정 요청 수준 알림을 발생합니다.

구문

virtual HRESULT NotifyCustomNotification(  
   ICustomNotificationProvider* pCustomOutput,  
   BOOL* pfCompletionExpected  
) = 0;  

매개 변수

pCustomOutput
ICustomNotificationProvider에 대한 포인터입니다.

pfCompletionExpected
true 비동기 완료가 예상되면 이고, 그렇지 않으면 입니다 false.

반환 값

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

설명
S_OK 작업이 성공했음을 나타냅니다.
ERROR_NOT_ENOUGH_MEMORY 작업을 수행할 메모리가 부족했음을 나타냅니다.

설명

메서드는 NotifyCustomNotification 매개 변수의 인터페이스 pCustomOutput 에 의해 ICustomNotificationProvider 지정된 사용자 지정 알림을 발생합니다.

모듈은 RQ_CUSTOM_NOTIFICATION 알림에 등록해야 하며, 사용자 지정 알림을 처리하려면 모듈 에 CHttpModule::OnCustomRequestNotification 메서드가 포함되어야 합니다. 사용자 지정 알림을 발생 하려면 모듈 먼저 사용자 지정 ICustomNotificationProvider 인터페이스의 instance 만들고 현재 요청 컨텍스트에 대 한 메서드에 해당 인터페이스를 NotifyCustomNotification 전달 해야 합니다.

예제

다음 코드 예제에서는 다음 작업을 수행하는 HTTP 모듈을 만드는 방법을 보여 줍니다.

  1. RQ_BEGIN_REQUESTRQ_CUSTOM_NOTIFICATION 알림을 등록합니다.

  2. OnBeginRequest 및OnCustomRequestNotification 메서드를 포함하는 CHttpModule 클래스를 만듭니다.

    1. 메서드는 OnBeginRequest 현재 알림을 지정하는 이벤트를 이벤트 뷰어 씁니다. 그런 다음 메서드는 인터페이스의 ICustomNotificationProvider instance 만들고 메서드를 사용하여 NotifyCustomNotification 사용자 지정 알림을 발생합니다.

    2. 메서드는 OnCustomRequestNotificationICustomNotificationProvider::QueryNotificationType 메서드를 사용하여 사용자 지정 알림에 대한 고유 식별자를 검색합니다. 고유 식별자가 일치하는 경우 메서드는 OnCustomRequestNotification 사용자 지정 알림이 발생했음을 지정하는 이벤트를 이벤트 뷰어 씁니다.

  3. 메모리에서 클래스를 CHttpModule 제거한 다음 종료합니다.

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

// Define the unique notification indentifier.
#define MY_CUSTOM_NOTIFICATION L"MyCustomNotification"

// Create the custom notification class.
class MyCustomProvider : public ICustomNotificationProvider
{
public:
    // Create the method that will identify the custom notification.
    PCWSTR QueryNotificationType(VOID)
    {
        // Return the unique identifier string for the custom notification.
        return MY_CUSTOM_NOTIFICATION;
    }
    // Create the method that will process errors.
    VOID SetErrorStatus(HRESULT hrError)
    {
        return;
    }
};

// Create the module class.
class MyHttpModule : public CHttpModule
{
private:

    // Create a handle for the Event Viewer.
    HANDLE m_hEventLog;
    // Create a pointer for the custom notification.
    MyCustomProvider * m_pCustomProvider;

public:

    MyHttpModule()
    {
        // Open the global handle to the Event Viewer.
        m_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
        // Initialize the pointer for the custom notification to NULL.
        m_pCustomProvider = NULL;
    }

    ~MyHttpModule()
    {
        // Test whether the handle for the Event Viewer is open.
        if (NULL != m_hEventLog)
        {
            // Close the handle to the event viewer.
            DeregisterEventSource( m_hEventLog );
            m_hEventLog = NULL;
        }
        // Test whether the pointer for the custom notification is valid.
        if (NULL != m_pCustomProvider)
        {
            // Remove the custom notification from memory.
            delete m_pCustomProvider;
            m_pCustomProvider = NULL;
        }
    }

    REQUEST_NOTIFICATION_STATUS
    OnBeginRequest(
        IN IHttpContext * pHttpContext,
        IN IHttpEventProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pHttpContext );

        // Create an array of strings.
        LPCSTR szBuffer[2] = {"MyHttpModule","OnBeginRequest"};
        // Write the strings to the Event Viewer.
        WriteEventViewerLog(szBuffer,2);

        // Create the custom notification provider class.
        MyCustomProvider * m_pCustomProvider = new MyCustomProvider;

        // Test if the custom notification pointer is valid.
        if (NULL != m_pCustomProvider)
        {
            // Raise the custom notification.
            BOOL fCompletionExpected = TRUE;
            pHttpContext->NotifyCustomNotification(m_pCustomProvider, &fCompletionExpected);
        }

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

    REQUEST_NOTIFICATION_STATUS
    OnCustomRequestNotification(
        IN IHttpContext * pHttpContext,
        IN ICustomNotificationProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pHttpContext );

        // Retrieve the custom notification type;
        PCWSTR pNotificationType = pProvider->QueryNotificationType();

        if (0 == wcscmp(pNotificationType,MY_CUSTOM_NOTIFICATION))
        {
            // Create an array of strings.
            LPCSTR szBuffer[2] = {"MyHttpModule","OnCustomRequestNotification"};
            // Write the strings to the Event Viewer.
            WriteEventViewerLog(szBuffer,2);
        }

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

private:

    // Create a method that writes to the Event Viewer.
    BOOL WriteEventViewerLog(LPCSTR szBuffer[], WORD wNumStrings)
    {
        // Test whether the handle for the Event Viewer is open.
        if (NULL != m_hEventLog)
        {
            // Write any strings to the Event Viewer and return.
            return ReportEvent(
                m_hEventLog,
                EVENTLOG_INFORMATION_TYPE,
                0, 0, NULL, wNumStrings,
                0, szBuffer, NULL );
        }
        return FALSE;
    }
};

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

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

        // 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 );

    // Create an HRESULT to receive return values from methods.
    HRESULT hr;

    // Set the request notifications.
    hr = pModuleInfo->SetRequestNotifications(
        new MyHttpModuleFactory,
        RQ_BEGIN_REQUEST | RQ_CUSTOM_NOTIFICATION, 0 );

    // Test for an error and exit if necessary.
    if (FAILED(hr))
    {
        return hr;
    }

    // Return a success status;
    return S_OK;
}

모듈은 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

참고 항목

ICustomNotificationProvider 인터페이스
IHttpContext 인터페이스
IHttpServer::NotifyCustomNotification 메서드