CHttpModule (clase)
Define la clase base para los módulos HTTP de nivel de solicitud.
Sintaxis
class CHttpModule
Métodos
En la tabla siguiente se enumeran los métodos expuestos por la CHttpModule
clase .
Nombre | Descripción |
---|---|
~CHttpModule | Desasigna una instancia de la CHttpModule clase . |
CHttpModule | Inicializa una nueva instancia de la clase CHttpModule . |
Dispose | Libera todos los recursos usados por la instancia actual de la clase CHttpModule . |
OnAcquireRequestState | Representa el método que controlará un AcquireRequestState evento, que se produce cuando IIS recupera el estado de la solicitud actual. |
OnAsyncCompletion | Representa el método que controlará un evento de finalización asincrónica, que se produce después de que una operación asincrónica haya terminado de procesarse. |
OnAuthenticateRequest | Representa el método que controlará un AuthenticateRequest evento, que se produce cuando IIS establece la identidad de un usuario. |
OnAuthorizeRequest | Representa el método que controlará un AuthorizeRequest evento, que se produce cuando IIS comprueba la autorización del usuario. |
OnBeginRequest | Representa el método que controlará un BeginRequest evento, que se produce como el primer evento de la canalización de procesamiento de solicitudes integrada HTTP para la solicitud actual. |
OnCustomRequestNotification | Representa el método que controlará un evento personalizado, que se produce cuando un módulo genera una notificación definida por el usuario. |
OnEndRequest | Representa el método que controlará un EndRequest evento, que se produce como el último evento de la canalización de procesamiento de solicitudes integrada HTTP para la solicitud actual. |
OnExecuteRequestHandler | Representa el método que controlará un ExecuteRequestHandler evento, que se produce cuando IIS ejecuta el controlador para la solicitud actual. |
OnLogRequest | Representa el método que controlará un LogRequest evento, que se produce cuando IIS se prepara para registrar la solicitud actual. |
OnMapPath | Representa el método que controlará un MapPath evento, que se produce cuando una operación solicita que se asigne la ruta de acceso física para la solicitud actual. |
OnMapRequestHandler | Representa el método que controlará un MapRequestHandler evento, que se produce cuando IIS asigna la solicitud actual a un controlador de eventos. |
OnPostAcquireRequestState | Representa el método que controlará un AcquireRequestState evento posterior, que se produce después de que IIS haya recuperado el estado de la solicitud actual. |
OnPostAuthenticateRequest | Representa el método que controlará un AuthenticateRequest evento posterior, que se produce después de que IIS haya establecido la identidad de un usuario. |
OnPostAuthorizeRequest | Representa el método que controlará un AuthorizeRequest evento posterior, que se produce después de que IIS haya comprobado la autorización del usuario. |
OnPostBeginRequest | Representa el método que controlará un BeginRequest evento posterior, que se produce después del primer evento de la canalización de procesamiento de solicitudes integrada HTTP. |
OnPostEndRequest | Representa el método que controlará un EndRequest evento posterior, que se produce después del último evento en la canalización de procesamiento de solicitudes integrada HTTP para la solicitud actual. |
OnPostExecuteRequestHandler | Representa el método que controlará un ExecuteRequestHandler evento posterior, que se produce después de que IIS ejecute el controlador para la solicitud actual. |
OnPostLogRequest | Representa el método que controlará un LogRequest evento posterior, que se produce después de que IIS haya registrado la solicitud actual. |
OnPostMapRequestHandler | Representa el método que controlará un MapRequestHandler evento posterior, que se produce después de que IIS haya asignado la solicitud actual al controlador de eventos adecuado. |
OnPostPreExecuteRequestHandler | Representa el método que controlará un PreExecuteRequestHandler evento posterior, que se produce antes de que IIS ejecute un controlador de solicitudes. |
OnPostReleaseRequestState | Representa el método que controlará un ReleaseRequestState evento posterior, que se produce después de que se haya liberado el estado actual. |
OnPostResolveRequestCache | Representa el método que controlará un ResolveRequestCache evento posterior, que se produce después de que IIS haya resuelto una solicitud de la memoria caché. |
OnPostUpdateRequestCache | Representa el método que controlará un UpdateRequestCache evento posterior, que se produce después de que IIS haya almacenado la solicitud en la memoria caché. |
OnPreExecuteRequestHandler | Representa el método que controlará un PreExecuteRequestHandler evento, que se produce antes de que IIS ejecute un controlador de solicitudes. |
OnReadEntity | Representa el método que controlará un ReadEntity evento, que se produce cuando una operación lee datos del búfer de solicitudes. |
OnReleaseRequestState | Representa el método que controlará un ReleaseRequestState evento, que se produce cuando se libera el estado actual. |
OnResolveRequestCache | Representa el método que controlará un ResolveRequestCache evento, que se produce cuando IIS resuelve una solicitud en la memoria caché. |
OnSendResponse | Representa el método que controlará un SendResponse evento, que se produce cuando IIS envía el búfer de respuesta. |
OnUpdateRequestCache | Representa el método que controlará un UpdateRequestCache evento, que se produce cuando IIS almacena la solicitud en la memoria caché. |
Clases derivadas
Esta clase no contiene clases derivadas.
Comentarios
La CHttpModule
clase es la clase base para los módulos HTTP de nivel de solicitud. Para crear una CHttpModule
clase derivada, debe crear un módulo HTTP de nivel de solicitud que contenga una clase que herede de CHttpModule
y una clase que derive de la interfaz IHttpModuleFactory . Para obtener más información sobre cómo crear módulos HTTP, consulte Diseño de Native-Code módulos HTTP.
La CHttpModule
clase proporciona métodos de constructor y destructor protegidos y un método público Dispose
. Al final de la solicitud, Dispose
se llama al método para eliminar la instancia de la CHttpModule
clase derivada de .
La CHttpModule
clase también define los métodos específicos de la notificación a los que IIS 7 llama cuando procesa eventos de nivel de solicitud dentro de la canalización integrada de procesamiento de solicitudes. Un módulo HTTP puede registrarse para eventos específicos mediante la definición de una lista de notificaciones en la función RegisterModule exportada de un módulo.
Eventos de solicitud deterministas
La mayoría de los métodos de notificación de nivel de solicitud se procesan cronológicamente durante el flujo normal de eventos de nivel de solicitud dentro de la canalización integrada. Cada uno de los métodos de notificación de nivel de solicitud deterministas tiene una notificación posterior a eventos coincidente, que permite a los módulos HTTP procesar cuándo se produce un evento o inmediatamente después de que se produzca el evento.
En la tabla siguiente se enumeran los métodos cronológicos de notificación de nivel de solicitud y posteriores al evento en el orden de su aparición dentro de la canalización integrada.
Método de notificación de eventos | Método de notificación posterior al evento |
---|---|
OnBeginRequest |
OnPostBeginRequest |
OnAuthenticateRequest |
OnPostAuthenticateRequest |
OnAuthorizeRequest |
OnPostAuthorizeRequest |
OnResolveRequestCache |
OnPostResolveRequestCache |
OnMapRequestHandler |
OnPostMapRequestHandler |
OnAcquireRequestState |
OnPostAcquireRequestState |
OnPreExecuteRequestHandler |
OnPostPreExecuteRequestHandler |
OnExecuteRequestHandler |
OnPostExecuteRequestHandler |
OnReleaseRequestState |
OnPostReleaseRequestState |
OnUpdateRequestCache |
OnPostUpdateRequestCache |
OnLogRequest |
OnPostLogRequest |
OnEndRequest |
OnPostEndRequest |
Por ejemplo, se produce antes de OnBeginRequest
, OnMapRequestHandler
se produce antes OnAuthenticateRequest
OnAcquireRequestState
de , etc.
Nota
Las notificaciones posteriores a los eventos se producen antes de la siguiente notificación cronológica de nivel de solicitud. Por ejemplo, se produce antes de OnPostAuthenticateRequest
, OnPostUpdateRequestCache
se produce antes OnAuthorizeRequest
OnLogRequest
de , etc.
Eventos de solicitud no deterministas
Los métodos de notificación de nivel de solicitud restantes no se procesan en ningún orden específico; en su lugar, IIS procesa estos eventos cuando se produce un evento no determinista específico. En la tabla siguiente se enumeran los eventos de nivel de solicitud no deterministas y los métodos de notificación posteriores a eventos relacionados.
Método de notificación de eventos | Método de notificación posterior al evento |
---|---|
OnAsyncCompletion |
(Ninguno) 1 |
OnCustomRequestNotification |
(Ninguno) 2 |
OnMapPath |
(Ninguna) |
OnReadEntity |
(Ninguna) |
OnSendResponse |
(Ninguna) |
1 Se OnAsyncCompletion
llama al método cuando se produce un evento asincrónico dentro de un módulo HTTP. Por lo tanto, no se puede registrar para una notificación asincrónica mediante la función RegisterModule exportada de un módulo. En su lugar, el módulo proporcionaría un OnAsyncCompletion
método para procesar las notificaciones que se producen después de llamar a métodos que devuelven de forma asincrónica (por ejemplo, los métodos IHttpContext::ExecuteRequest e IHttpResponse::WriteEntityChunks ). Cuando IIS llama a OnAsyncCompletion
, el método pasará parámetros que indican el tipo de notificación y si la notificación era para un evento o posterior.
2 El OnCustomRequestNotification
método no tiene un método de notificación posterior al evento correspondiente. Un módulo HTTP puede registrarse para una notificación personalizada mediante la función exportada RegisterModule
del módulo, pero un módulo no puede registrarse para una notificación que se produce después de que se haya producido una notificación personalizada.
Ejemplo
En el ejemplo siguiente se muestra cómo crear un módulo HTTP sencillo de "Hola mundo". El módulo define una función exportada RegisterModule
que pasa una instancia de una IHttpModuleFactory
interfaz al método IHttpModuleRegistrationInfo::SetRequestNotifications y registra la notificación de RQ_BEGIN_REQUEST . IIS usa el método IHttpModuleFactory::GetHttpModule para crear una instancia de una CHttpModule
clase y devuelve un estado correcto. IIS también usa el método IHttpModuleFactory::Terminate para quitar el generador de la memoria.
Cuando se produce una RQ_BEGIN_REQUEST
notificación, IIS llama al método del OnBeginRequest
módulo para procesar la solicitud actual. OnBeginRequest
borra el búfer de respuesta y modifica el tipo MIME para la respuesta. A continuación, el método crea un fragmento de datos que contiene una cadena "Hola mundo" y devuelve la cadena a un cliente web. Por último, el módulo devuelve un indicador de estado que notifica a IIS que todas las notificaciones han finalizado y, a continuación, se cierran.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class CHelloWorld : public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Retrieve a pointer to the response.
IHttpResponse * pHttpResponse = pHttpContext->GetResponse();
// Test for an error.
if (pHttpResponse != NULL)
{
// Clear the existing response.
pHttpResponse->Clear();
// Set the MIME type to plain text.
pHttpResponse->SetHeader(
HttpHeaderContentType,"text/plain",
(USHORT)strlen("text/plain"),TRUE);
// Create a string with the response.
PCSTR pszBuffer = "Hello World!";
// Create a data chunk.
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 = pHttpResponse->WriteEntityChunks(
&dataChunk,1,FALSE,TRUE,&cbSent);
// Test for an error.
if (FAILED(hr))
{
// Set the HTTP status.
pHttpResponse->SetStatus(500,"Server Error",0,hr);
}
// End additional processing.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
};
// Create the module's class factory.
class CHelloWorldFactory : public IHttpModuleFactory
{
public:
HRESULT
GetHttpModule(
OUT CHttpModule ** ppModule,
IN IModuleAllocator * pAllocator
)
{
UNREFERENCED_PARAMETER( pAllocator );
// Create a new instance.
CHelloWorld * pModule = new CHelloWorld;
// 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 );
// Set the request notifications and exit.
return pModuleInfo->SetRequestNotifications(
new CHelloWorldFactory,
RQ_BEGIN_REQUEST,
0
);
}
El módulo debe exportar la RegisterModule
función. Puede exportar esta función mediante la creación de un archivo de definición de módulo (.def) para el proyecto, o bien puede compilar el módulo mediante el /EXPORT:RegisterModule
modificador . Para obtener más información, vea Tutorial: Creación de un módulo HTTP de Request-Level mediante código nativo.
Opcionalmente, puede compilar el código mediante la __stdcall (/Gz)
convención de llamada en lugar de declarar explícitamente la convención de llamada para cada función.
Requisitos
Tipo | Descripción |
---|---|
Remoto | - IIS 7.0 en Windows Vista - IIS 7.5 en Windows 7 - IIS 8.0 en Windows 8 - IIS 10.0 en Windows 10 |
Servidor | - IIS 7.0 en Windows Server 2008 - IIS 7.5 en Windows Server 2008 R2 - IIS 8.0 en Windows Server 2012 - IIS 8.5 en Windows Server 2012 R2 - IIS 10.0 en Windows Server 2016 |
Producto | - 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 |
Encabezado | Httpserv.h |
Consulte también
Creación de módulos HTTP de Native-Code
CGlobalModule (clase)