Метод IHttpModuleRegistrationInfo::SetRequestNotifications
Регистрирует уведомления уровня запроса для модуля.
Синтаксис
virtual HRESULT SetRequestNotifications(
IN IHttpModuleFactory* pModuleFactory,
IN DWORD dwRequestNotifications,
IN DWORD dwPostRequestNotifications
) = 0;
Параметры
pModuleFactory
[IN] Указатель на интерфейс IHttpModuleFactory .
dwRequestNotifications
[IN] Значение битовой маски, содержащее уведомления о запросах для регистрации. (Определяется в Httpserv.h.)
dwPostRequestNotifications
[IN] Значение битовой маски, содержащее регистрируемое уведомление о событиях. (Определяется в Httpserv.h.)
Возвращаемое значение
Объект HRESULT
. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.
Значение | Описание: |
---|---|
S_OK | Указывает, что операция прошла успешно. |
ERROR_ALREADY_EXISTS | Указывает, что модуль уже зарегистрирован. |
Комментарии
Метод SetRequestNotifications
регистрирует уведомления уровня запроса для класса CHttpModule . Модуль может зарегистрировать два события для каждого уведомления: уведомление о событии, как указано в битовой маске в dwRequestNotifications
параметре, и уведомление после события, как указано в битовой маске в параметре dwPostRequestNotifications
.
Например, модуль HTTP может зарегистрироваться для уведомления RQ_AUTHENTICATE_REQUEST и уведомления после события для этого же уведомления. При этом модуль может предоставить дополнительные функции обработки для уведомления о событии и очистить все сведения об обработке в уведомлении после события.
Примечание
Некоторые события не имеют уведомления после события. Используйте 0 для параметра , dwPostRequestNotifications
если уведомление не требуется или уведомление после события не поддерживается.
Примечание
Значения битовой маски для уведомлений уровня запроса определяются в файле Httpserv.h.
Методу SetRequestNotifications
требуется указатель на интерфейс IHttpModuleFactory , который iis будет использовать для создания экземпляра CHttpModule
класса. Эта фабрика должна обрабатывать создание экземпляра CHttpModule
класса и возвращать сообщения об ошибках, если не удается создать класс.
Пример
В следующем примере показано, как создать модуль HTTP, который использует функцию RegisterModule и следующие методы для регистрации модуля для уведомлений глобального уровня и на уровне запросов.
Метод
SetRequestNotifications
регистрируетCHttpModule
класс для уведомления OnBeginRequest уровня запроса.Метод SetPriorityForRequestNotification задает приоритет модуля для уведомлений на уровне запроса.
Метод SetGlobalNotifications регистрирует класс CGlobalModule для уведомления OnGlobalPreBeginRequest глобального уровня.
Метод SetPriorityForGlobalNotification задает приоритет модуля для уведомления глобального уровня.
Модуль отвечает на зарегистрированные уведомления и записывает записи в журнал приложения в Просмотр событий.
Примечание
Записи в Просмотр событий будут отображать "IISADMIN" в качестве источника событий.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create a global handle for the Event Viewer.
HANDLE g_hEventLog;
// Define the method that writes to the Event Viewer.
BOOL WriteEventViewerLog(LPCSTR szBuffer[], WORD wNumStrings);
// Create the HTTP module class.
class MyHttpModule : public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pHttpContext );
UNREFERENCED_PARAMETER( pProvider );
// Create an array of strings.
LPCSTR szBuffer[2] = {"MyHttpModule","OnBeginRequest"};
// Write the strings to the Event Viewer.
WriteEventViewerLog(szBuffer,2);
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
};
// Create the module's global class.
class MyGlobalModule : public CGlobalModule
{
public:
GLOBAL_NOTIFICATION_STATUS
OnGlobalPreBeginRequest(
IN IPreBeginRequestProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Create an array of strings.
LPCSTR szBuffer[2] = {"MyGlobalModule","OnGlobalPreBeginRequest"};
// 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;
}
MyGlobalModule()
{
// Open a handle to the Event Viewer.
g_hEventLog = RegisterEventSource( NULL,"IISADMIN" );
}
~MyGlobalModule()
{
// Test whether the handle for the Event Viewer is open.
if (NULL != g_hEventLog)
{
DeregisterEventSource( g_hEventLog );
g_hEventLog = NULL;
}
}
};
// 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;
}
};
// Define 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 != g_hEventLog)
{
// Write any strings to the Event Viewer and return.
return ReportEvent(
g_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;
// Set the request notifications.
hr = pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_BEGIN_REQUEST, 0 );
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
// Set the request priority.
hr = pModuleInfo->SetPriorityForRequestNotification(
RQ_BEGIN_REQUEST,PRIORITY_ALIAS_MEDIUM);
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
// 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 );
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
// Set the global priority.
hr = pModuleInfo->SetPriorityForGlobalNotification(
GL_PRE_BEGIN_REQUEST,PRIORITY_ALIAS_LOW);
// Test for an error and exit if necessary.
if (FAILED(hr))
{
return hr;
}
// Return a success status;
return S_OK;
}
Модуль должен экспортировать функцию RegisterModule
. Эту функцию можно экспортировать, создав файл определения модуля (DEF- файл) для проекта, или скомпилировать модуль с помощью /EXPORT:RegisterModule
параметра . Дополнительные сведения см. в разделе Пошаговое руководство. Создание модуля HTTP Request-Level с помощью машинного кода.
При необходимости можно скомпилировать код с помощью __stdcall (/Gz)
соглашения о вызовах вместо явного объявления соглашения о вызовах для каждой функции.
Требования
Тип | Описание |
---|---|
клиент | — IIS 7.0 в Windows Vista — IIS 7.5 в Windows 7 — IIS 8.0 в Windows 8 — IIS 10.0 в Windows 10 |
Сервер | — IIS 7.0 в Windows Server 2008 — IIS 7.5 в Windows Server 2008 R2 — IIS 8.0 в Windows Server 2012 — IIS 8.5 в Windows Server 2012 R2 — IIS 10.0 в Windows Server 2016 |
Продукт | — 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 |
См. также:
Интерфейс IHttpModuleRegistrationInfo
Метод IHttpModuleRegistrationInfo::SetGlobalNotifications
Метод IHttpModuleRegistrationInfo::SetPriorityForGlobalNotification
Метод IHttpModuleRegistrationInfo::SetPriorityForRequestNotification
Функция PFN_REGISTERMODULE