ICustomNotificationProvider 인터페이스
사용자 지정 알림을 만들기 위한 인터페이스를 제공합니다.
구문
class ICustomNotificationProvider : public IHttpEventProvider
메서드
다음 표에서는 인터페이스에 의해 노출되는 메서드를 나열합니다 ICustomNotificationProvider
.
속성 | Description |
---|---|
QueryNotificationType | 사용자 지정 알림 공급자의 고유 식별자를 반환합니다. |
SetErrorStatus | ( IHttpEventProvider에서 상속됩니다.) |
파생 클래스
이 인터페이스에는 파생 클래스가 없습니다.
설명
IIS 7은 개발자가 ICustomNotificationProvider
사용자 지정 알림을 만들 수 있도록 하는 인터페이스를 제공합니다. 사용자 지정 알림을 구현하려면 QueryNotificationType 및 SetErrorStatus 메서드를 ICustomNotificationProvider
제공하는 인터페이스의 instance 만들어야 합니다.
사용자 지정 알림은 메서드를 QueryNotificationType
사용하여 RQ_CUSTOM_NOTIFICATION 또는GL_CUSTOM_NOTIFICATION 알림에 등록된 모듈에 대해 자신을 식별합니다.
사용자 지정 알림이 발생하면 IIS는 모듈의 CHttpModule::OnCustomRequestNotification 또는 CGlobalModule::OnGlobalCustomNotification 메서드를 호출하여 사용자 지정 알림을 처리합니다. IIS는 발생한 사용자 지정 알림에 대한 인터페이스에 대한 포인터 ICustomNotificationProvider
를 전달하며, 모듈은 사용자 지정 알림의 QueryNotificationType
메서드를 호출하여 올바른 알림을 처리하고 있는지 확인해야 합니다.
예제
다음 코드 예제에서는 다음을 수행하는 HTTP 모듈을 만드는 방법을 보여 줍니다.
RQ_BEGIN_REQUEST 및
RQ_CUSTOM_NOTIFICATION
알림을 등록합니다.OnBeginRequest 및OnCustomRequestNotification 메서드를 포함하는 CHttpModule 클래스를 만듭니다.
메서드는
OnBeginRequest
현재 알림을 지정하는 이벤트 뷰어 이벤트를 씁니다. 그런 다음 메서드는 인터페이스의ICustomNotificationProvider
instance 만들고 IHttpContext::NotifyCustomNotification 메서드를 사용하여 사용자 지정 알림을 발생합니다.OnCustomRequestNotification
메서드는 메서드를QueryNotificationType
사용하여 사용자 지정 알림에 대한 고유 식별자를 검색합니다. 고유 식별자가 일치하는 경우 메서드는OnCustomRequestNotification
사용자 지정 알림이 발생했음을 지정하는 이벤트를 이벤트 뷰어 씁니다.
메모리에서 클래스를
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)
코드를 컴파일할 수 있습니다.
상속 계층 구조
ICustomNotificationProvider
요구 사항
형식 | 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 |