다음을 통해 공유


IHttpServer::NotifyCustomNotification 메서드

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

구문

virtual GLOBAL_NOTIFICATION_STATUS NotifyCustomNotification(  
   ICustomNotificationProvider* pCustomOutput  
) = 0;  

매개 변수

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

반환 값

GLOBAL_NOTIFICATION_STATUS 값입니다.

설명

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

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

예제

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

  1. GL_PRE_BEGIN_REQUESTGL_CUSTOM_NOTIFICATION 알림에 등록합니다.

  2. OnGlobalPreBeginRequestOnGlobalCustomNotification 메서드를 포함하는 CGlobalModule 클래스를 만듭니다.

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

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

  3. 메모리에서 클래스를 CGlobalModule 제거하고 종료합니다.

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

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

// Create a pointer for the global server interface.
IHttpServer * g_pHttpServer = NULL;

// 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's global class.
class MyGlobalModule : public CGlobalModule
{
private:

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

public:

    MyGlobalModule()
    {
        // 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;
    }

    ~MyGlobalModule()
    {
        // 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;
        }
    }

    GLOBAL_NOTIFICATION_STATUS
    OnGlobalPreBeginRequest(
        IN IPreBeginRequestProvider * pProvider
    )
    {
        // Create an array of strings.
        LPCSTR szBuffer[2] = {"MyGlobalModule","OnGlobalPreBeginRequest"};
        // Write the strings to the Event Viewer.
        WriteEventViewerLog(szBuffer,2);

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

        // Test if the server and notification pointers are valid.
        if ((NULL != m_pCustomProvider) && (NULL != g_pHttpServer))
        {
            // Raise the custom notification.
            BOOL fCompletionExpected = TRUE;
            g_pHttpServer->NotifyCustomNotification(m_pCustomProvider);
        }

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

    GLOBAL_NOTIFICATION_STATUS
    OnGlobalCustomNotification(
        IN ICustomNotificationProvider * pProvider
    )
    {
        // Retrieve the custom notification type;
        PCWSTR pNotificationType = pProvider->QueryNotificationType();

        // Test if the custom notification is correct.
        if (0 == wcscmp(pNotificationType,MY_CUSTOM_NOTIFICATION))
        {
            // Create an array of strings.
            LPCSTR szBuffer[2] = {"MyGlobalModule","OnGlobalCustomNotification"};
            // Write the strings to the Event Viewer.
            WriteEventViewerLog(szBuffer,2);
        }

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

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

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

    // Store the pointer for the global server interface.
    g_pHttpServer = pGlobalInfo;

    // Create an instance of the global module class.
    MyGlobalModule * pGlobalModule = new MyGlobalModule;
 
    // Test for an error.
    if (NULL == pGlobalModule)
    {
        return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
    }

    // Set the global notifications.
    hr = pModuleInfo->SetGlobalNotifications(
        pGlobalModule, GL_PRE_BEGIN_REQUEST | GL_CUSTOM_NOTIFICATION );

    // 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 인터페이스
IHttpServer 인터페이스
IHttpContext::NotifyCustomNotification 메서드