Método IHttpContext::GetNextNotification
Recupera a próxima notificação para o host do módulo atual.
Sintaxe
virtual BOOL GetNextNotification(
IN REQUEST_NOTIFICATION_STATUS status,
OUT DWORD* pdwNotification,
OUT BOOL* pfIsPostNotification,
OUT CHttpModule** ppModuleInfo,
OUT IHttpEventProvider** ppRequestOutput
) = 0;
Parâmetros
status
[IN] O REQUEST_NOTIFICATION_STATUS valor de enumeração a ser retornado da notificação atual.
pdwNotification
[OUT] Um ponteiro para um DWORD
que contém o valor de máscara de bits para a próxima notificação.
pfIsPostNotification
[OUT] Um ponteiro para um valor booliano. true
para indicar que a notificação é uma pós-notificação; caso contrário, false
.
ppModuleInfo
[OUT] Um ponteiro para o endereço da classe CHttpModule responsável por processar a notificação retornada.
ppRequestOutput
[OUT] Um ponteiro para o endereço da interface IHttpEventProvider para a notificação retornada.
Valor Retornado
true
se a chamada para GetNextNotification
foi bem-sucedida; caso contrário, false
.
Comentários
Os módulos HTTP podem usar o GetNextNotification
método para mesclar notificações no mesmo host do módulo. Retornar o processamento para o pipeline de processamento de solicitação integrado requer uma pequena quantidade de sobrecarga. Para ignorar essa sobrecarga, um módulo HTTP pode chamar o GetNextNotification
método para pular para a próxima notificação e continuar o processamento, desde que as duas notificações estejam dentro do mesmo host do módulo e nenhum manipulador de notificação adicional seja registrado para processar uma solicitação entre notificações.
Por exemplo, um módulo HTTP pode conter um método OnResolveRequestCache e outro módulo HTTP dentro do mesmo host de módulo pode conter um método OnPostResolveRequestCache . O primeiro módulo pode chamar o GetNextNotification
método para continuar o processamento, em vez de retornar o processamento para o pipeline, como se o módulo já tivesse se registrado para o OnPostResolveRequestCache
método de notificação pós-evento.
Observação
Se a chamada para GetNextNotification
retornar false
, você poderá habilitar uma regra de rastreamento de solicitação com falha que permitirá examinar quais notificações o IIS está processando.
Exemplo
O exemplo de código a seguir demonstra como criar um módulo HTTP que executa as seguintes tarefas:
Registra-se para várias notificações.
Cria um método auxiliar que chama o
GetNextNotification
método , que tenta pular para a próxima notificação.Para cada notificação registrada, define manipuladores de notificação que chamam o método auxiliar e exibe o retorno status para o cliente.
#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
);
}
Seu módulo deve exportar a função RegisterModule . Você pode exportar essa função criando um arquivo de definição de módulo (.def) para seu projeto ou pode compilar o módulo usando a opção /EXPORT:RegisterModule
. Para obter mais informações, consulte Passo a passo: criando um módulo HTTP Request-Level usando código nativo.
Opcionalmente, você pode compilar o código usando a __stdcall (/Gz)
convenção de chamada em vez de declarar explicitamente a convenção de chamada para cada função.
Requisitos
Type | Descrição |
---|---|
Cliente | – IIS 7.0 no Windows Vista – IIS 7.5 no Windows 7 – IIS 8.0 no Windows 8 – IIS 10.0 no Windows 10 |
Servidor | – IIS 7.0 no Windows Server 2008 – IIS 7.5 no Windows Server 2008 R2 – IIS 8.0 no Windows Server 2012 – IIS 8.5 no Windows Server 2012 R2 – IIS 10.0 no Windows Server 2016 |
Produto | - 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 |
parâmetro | Httpserv.h |