Controlar eventos públicos
Cualquier evento público provocado por la clase HttpApplication es compatible mediante la sintaxis Aplicación_NombreEvento. Por ejemplo, un controlador para el evento Error se puede declarar como protected void Application_Error(Object sender, EventArgs e)
. También se proporciona compatibilidad con eventos asincrónicos.
Hay tres categorías de eventos públicos: eventos de aplicación provocados por HttpApplication, eventos de módulo provocados por HttpModules y eventos asincrónicos provocados por HTTPApplication.
Eventos de aplicación
En las siguientes tablas se muestran los eventos provocados por HttpApplication durante la vida de una aplicación. En la primera tabla se muestran los eventos provocados antes de que se ejecute la aplicación. Los eventos se muestran en el orden en que tienen lugar.
Evento | Descripción |
---|---|
BeginRequest | Señala una nueva solicitud; se garantiza que se provoca en cada solicitud. |
AuthenticateRequest | Señala que la solicitud ya se puede autenticar; lo utiliza el módulo de seguridad. |
AuthorizeRequest | Señala que la solicitud ya se puede autorizar; lo utiliza el módulo de seguridad. |
ResolveRequestCache | Lo utiliza el módulo de caché de resultados para cortocircuitar el procesamiento de solicitudes almacenadas en caché. |
AcquireRequestState | Indica que se debe obtener el estado de cada solicitud. |
PreRequestHandlerExecute | Indica que el controlador de solicitudes está a punto de ejecutarse. Éste es el ultimo evento en el que puede participar antes de que se llame al controlador HTTP para esta solicitud. |
En la siguiente tabla se muestran los eventos provocados después de que haya vuelto una aplicación. Los eventos se muestran en el orden en que tienen lugar.
Evento | Descripción |
---|---|
PostRequestHandlerExecute | Indica que el HttpHandler ha terminado de procesar la solicitud. |
ReleaseRequestState | Señala que el estado de la solicitud se debe almacenar porque la aplicación ha terminado con la solicitud. |
UpdateRequestCache | Indica que el procesamiento de código ha terminado y ya se puede agregar el archivo a la caché de ASP.NET. |
EndRequest | Indica que ha terminado todo el procesamiento para la solicitud. Éste es el ultimo evento al que se llama cuando finaliza la aplicación. |
Además, hay tres eventos por solicitud que pueden provocarse en un orden no determinista. Se muestran en la tabla siguiente.
Evento | Descripción |
---|---|
PreSendRequestHeaders | Indica que se van a enviar encabezados HTTP al cliente. Esto ofrece la posibilidad de agregar, quitar o modificar los encabezados antes de que se envíen. |
PreSendRequestContent | Indica que se va a enviar contenido al cliente. Esto ofrece la posibilidad de modificar el contenido antes de que se envíe. |
Error | Indica una excepción no controlada. |
Eventos de módulo
Es posible conectarse a eventos publicados por HttpModules definidos en la configuración. Por ejemplo, Machine.config
declara los siguientes módulos predeterminados para todas las aplicaciones.
<httpModules>
<add name="OutputCache" type="System.Web.Caching.OutputCacheModule, .../>
<add name="Session" type="System.Web.SessionState.SessionStateModule, .../>
<add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule, .../>
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule .../>
<add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule .../>
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule, .../>
<add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule, .../>
</httpModules>
En cualquiera de estas clases, busque los eventos públicos que definen. Puede conectarlos en Global.asax mediante la sintaxis NombreMódulo**_OnEvent**Nombre. Por ejemplo, el evento Start del módulo SessionStateModule se declara protected void Session_Start(Object sender, EventArgs e)
en Global.asax. Puede utilizar la sintaxis Session_OnStart en un bloque <script runat=server>
de un archivo de aplicación ASP.NET para definir un controlador de evento para el evento Start de SessionStateModule como sigue.
<script language="VB" runat="server">
Sub Session_OnStart()
' Session startup code goes here.
End Sub
</script>
Nota Puede utilizar la misma sintaxis NombreMódulo**_OnEvent**NombreEvento para conectar eventos en sus propios módulos personalizados, siempre y cuando se declaren en el archivo de configuración de su aplicación.
Eventos asincrónicos
Los controladores de eventos para eventos asincrónicos de HttpApplication deben conectarse explícitamente llamando al método AddAsynchronousEventName en Global.asax. Por ejemplo, un controlador de eventos asincrónicos del evento OnPostRequestHandlerExecuteAsync
se registrarían para el evento llamando al método AddOnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler
, System.Web.EndEventHandler)
. La sintaxis abreviada Aplicación**_On**NombreEvento sólo es válida para eventos sincrónicos. Las declaraciones para los eventos asincrónicos HttpApplication son las siguientes.
void OnAcquireRequestStateAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnAuthenticateRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnAuthorizeRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnBeginRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnEndRequestAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnPreRequestHandlerExecuteAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnReleaseRequestStateAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnResolveRequestCacheAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
void OnUpdateREquestCacheAsync(System.Web.BeginEventHandler, System.Web.EndEventHandler)
A continuación se muestra un ejemplo de un bloque de código que puede incluir en Global.asax para crear un controlador asincrónico para el evento OnPostRequestHandlerExecuteAsync
.
<%@ language=c# %>
<%@ import namespace="System.Threading" %>
<script runat=server>
public override void Init() {
// Connect the asynchronous event PreRequestHandlerExecuteAsync.
AddOnPreRequestHandlerExecuteAsync(
new BeginEventHandler(this.BeginPreHandlerExecute),
new EndEventHandler(this.EndPreHandlerExecute));
}
IAsyncResult BeginPreHandlerExecute(Object source, EventArgs e, AsyncCallback cb, Object extraData) {
AsynchOperation asynch = new AsynchOperation(cb, Context, extraData);
asynch.StartAsyncWork();
return asynch;
}
void EndPreHandlerExecute(IAsyncResult ar) {
}
class AsynchOperation : IAsyncResult {
private bool _completed;
private Object _state;
private AsyncCallback _callback;
private HttpContext _context;
bool IAsyncResult.IsCompleted { get { return _completed; } }
WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
Object IAsyncResult.AsyncState { get { return _state; } }
bool IAsyncResult.CompletedSynchronously { get { return false; } }
public AsynchOperation(AsyncCallback callback, HttpContext context, Object state) {
_callback = callback;
_context = context;
_state = state;
_completed = false;
}
public void StartAsyncWork() {
ThreadPool.QueueUserWorkItem(new WaitCallback(DoSomething), null /*workItemState*/);
}
private void DoSomething(Object workItemState) {
_context.Items["PreHandlerExecute"] = "Hello World from Async PreHandleExecute!";
_completed = true;
_callback(this);
}
}
</script>
Vea también
Compatibilidad con el motor de tiempo de ejecución para HTTP | HttpModules Ejemplo de HttpModule personalizado | Controlar y provocar eventos