Метод IHttpModuleRegistrationInfo::SetPriorityForRequestNotification
Задает приоритет уровня запроса для модуля.
Синтаксис
virtual HRESULT SetPriorityForRequestNotification(
IN DWORD dwRequestNotification,
IN PCWSTR pszPriority
) = 0;
Параметры
dwRequestNotification
[IN] Значение битовой маски, содержащее уведомления о запросах, которые необходимо задать для уровня приоритета. (Определяется в Httpserv.h.)
pszPriority
[IN] Указатель на строку, содержащую псевдоним приоритета. (Определяется в Httpserv.h.)
Возвращаемое значение
Объект HRESULT
. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.
Значение | Описание: |
---|---|
S_OK | Указывает, что операция прошла успешно. |
Комментарии
Метод SetPriorityForRequestNotification
задает уровень приоритета для списка уведомлений уровня запроса, для которых зарегистрирован модуль HTTP. IIS использует уровень приоритета для определения порядка в уведомлении о том, что модули должны быть упорядочены. Уровни приоритета инвертируются для уведомлений CHttpModule::OnSendResponse . Например, модуль HTTP, зарегистрированный для уведомления CHttpModule::OnBeginRequest с помощью PRIORITY_ALIAS_HIGH
псевдонима, будет иметь приоритет перед модулем, зарегистрированным для OnBeginRequest
уведомления с помощью PRIORITY_ALIAS_LOW
псевдонима . Модуль HTTP, зарегистрированный для OnSendResponse
уведомления с помощью псевдонима PRIORITY_ALIAS_HIGH
, будет выполняться после модуля, зарегистрированного для OnSendResponse
уведомления с помощью псевдонима PRIORITY_ALIAS_LOW
.
Примечание
Значения битовой маски для уведомлений уровня запроса и псевдонимов приоритета определяются в файле Httpserv.h.
Примечание
Уровни приоритета инвертируются для RQ_SEND_RESPONSE
уведомлений.
Пример
В следующем примере показано, как создать модуль 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::SetRequestNotifications
Функция PFN_REGISTERMODULE