Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Извлекает следующее уведомление для текущего узла модуля.
Синтаксис
virtual BOOL GetNextNotification(
IN REQUEST_NOTIFICATION_STATUS status,
OUT DWORD* pdwNotification,
OUT BOOL* pfIsPostNotification,
OUT CHttpModule** ppModuleInfo,
OUT IHttpEventProvider** ppRequestOutput
) = 0;
Параметры
status
[IN] Значение перечисления REQUEST_NOTIFICATION_STATUS , возвращаемое из текущего уведомления.
pdwNotification
[OUT] Указатель на объект , DWORD содержащий значение битовой маски для следующего уведомления.
pfIsPostNotification
[OUT] Указатель на логическое значение. true чтобы указать, что уведомление является пост-уведомлением; в противном случае — false.
ppModuleInfo
[OUT] Указатель на адрес класса CHttpModule , который отвечает за обработку возвращенного уведомления.
ppRequestOutput
[OUT] Указатель на адрес интерфейса IHttpEventProvider для возвращаемого уведомления.
Возвращаемое значение
true Значение , если вызов выполнен GetNextNotification успешно; в противном случае — значение false.
Комментарии
Http-модули могут использовать GetNextNotification метод для объединения уведомлений в одном узле модуля. Возвращение обработки в интегрированный конвейер обработки запросов требует небольших затрат. Чтобы обойти эти издержки, модуль HTTP может вызвать GetNextNotification метод , чтобы перейти к следующему уведомлению и продолжить обработку при условии, что два уведомления находятся в одном узле модуля и не зарегистрированы дополнительные обработчики уведомлений для обработки запроса между уведомлениями.
Например, модуль HTTP может содержать метод OnResolveRequestCache , а другой модуль HTTP в том же узле модуля может содержать метод OnPostResolveRequestCache . Первый модуль может вызвать GetNextNotification метод , чтобы продолжить обработку, а не возвращать обработку в конвейер, как если бы модуль уже зарегистрирован для OnPostResolveRequestCache метода уведомления после события.
Примечание
Если вызов GetNextNotification возвращает false, можно включить правило трассировки неудачных запросов, которое позволит проверить, какие уведомления обрабатывает IIS.
Пример
В следующем примере кода показано, как создать модуль HTTP, который выполняет следующие задачи:
Регистрирует несколько уведомлений.
Создает вспомогательный метод, вызывающий
GetNextNotificationметод , который пытается перейти к следующему уведомлению.Для каждого зарегистрированного уведомления определяет обработчики уведомлений, которые вызывают вспомогательный метод, а затем отображает состояние возврата клиенту.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Clear the existing response.
pHttpContext->GetResponse()->Clear();
// Set the MIME type to plain text.
pHttpContext->GetResponse()->SetHeader(
HttpHeaderContentType,"text/plain",
(USHORT)strlen("text/plain"),TRUE);
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnAuthenticateRequest(
IN IHttpContext * pHttpContext,
IN IAuthenticationProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Attempt to retrieve the next notification and display the result.
GetNotificationAndDisplayResult(
pHttpContext,"OnAuthenticateRequest\n");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnPostAuthenticateRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Attempt to retrieve the next notification and display the result.
GetNotificationAndDisplayResult(
pHttpContext,"\nOnPostAuthenticateRequest\n");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnAuthorizeRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Attempt to retrieve the next notification and display the result.
GetNotificationAndDisplayResult(
pHttpContext,"\nOnAuthorizeRequest\n");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnPostAuthorizeRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Attempt to retrieve the next notification and display the result.
GetNotificationAndDisplayResult(
pHttpContext,"\nOnPostAuthorizeRequest\n");
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
REQUEST_NOTIFICATION_STATUS
OnMapRequestHandler(
IN IHttpContext * pHttpContext,
IN IMapHandlerProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pHttpContext );
UNREFERENCED_PARAMETER( pProvider );
// End additional processing.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
private:
// Create a helper method that attempts to retrieve the next
// notification and returns the status to a Web client.
void GetNotificationAndDisplayResult(
IHttpContext * pHttpContext,
PCSTR pszBuffer
)
{
DWORD dwNotification = 0;
BOOL fPostNotification = FALSE;
CHttpModule * pHttpModule = NULL;
IHttpEventProvider * pEventProvider = NULL;
char szBuffer[256]="";
// Attempt to retrive the next notification.
BOOL fReturn = pHttpContext->GetNextNotification(
RQ_NOTIFICATION_CONTINUE,
&dwNotification,&fPostNotification,
&pHttpModule,&pEventProvider);
// Return the name of the notification to a Web client.
WriteResponseMessage(pHttpContext,pszBuffer);
// Return the status of the GetNextNotification method to a Web client.
sprintf_s(szBuffer,255,"\tGetNextNotification return value: %s\n",
fReturn==TRUE?"true":"false");
WriteResponseMessage(pHttpContext,szBuffer);
// Return the notification bitmask to a Web client.
sprintf_s(szBuffer,255,"\tNotification: %08x\n",dwNotification);
WriteResponseMessage(pHttpContext,szBuffer);
// Return whether the notification is a post-notification.
sprintf_s(szBuffer,255,"\tPost-notification: %s\n",
fPostNotification==TRUE?"Yes":"No");
WriteResponseMessage(pHttpContext,szBuffer);
}
// Create a utility method that inserts a string value into the response.
HRESULT WriteResponseMessage(
IHttpContext * pHttpContext,
PCSTR pszBuffer
)
{
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Create a data chunk. (Defined in the Http.h file.)
HTTP_DATA_CHUNK dataChunk;
// Set the chunk to a chunk in memory.
dataChunk.DataChunkType = HttpDataChunkFromMemory;
// Buffer for bytes written of data chunk.
DWORD cbSent;
// Set the chunk to the buffer.
dataChunk.FromMemory.pBuffer =
(PVOID) pszBuffer;
// Set the chunk size to the buffer size.
dataChunk.FromMemory.BufferLength =
(USHORT) strlen(pszBuffer);
// Insert the data chunk into the response.
hr = pHttpContext->GetResponse()->WriteEntityChunks(
&dataChunk,1,FALSE,TRUE,&cbSent);
// Test for an error.
if (FAILED(hr))
{
// Return the error status.
return hr;
}
// Return a success status.
return S_OK;
}
};
// 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 we 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 );
return pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_BEGIN_REQUEST | RQ_AUTHENTICATE_REQUEST |
RQ_AUTHORIZE_REQUEST | RQ_MAP_REQUEST_HANDLER,
RQ_AUTHENTICATE_REQUEST | RQ_AUTHORIZE_REQUEST
);
}
Модуль должен экспортировать функцию 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 |