Gestion des événements publics
Tous les événements publics déclenchés par la classe HttpApplication sont pris en charge en utilisant la syntaxe Application_NomÉvénement. Par exemple, un gestionnaire pour l'événement Error peut être déclaré protected void Application_Error(Object sender, EventArgs e)
. Une prise en charge est également fournie pour les événements asynchrones.
Il existe trois catégories d'événements publics : les événements d'application déclenchés par HttpApplication, les événements de module déclenchés par des modules HttpModule et les événements asynchrones déclenchés par HTTPApplication.
Événements d'application
Les tableaux suivants montrent les événements déclenchés par HttpApplication durant la vie d'une application. Le premier tableau montre les événements déclenchés avant que l'application ne s'exécute. Les événements sont répertoriés dans l'ordre dans lequel ils se produisent.
Événement | Description |
---|---|
BeginRequest | Signale une nouvelle demande ; obligatoirement déclenché à chaque demande. |
AuthenticateRequest | Signale que la demande est prête à être authentifiée ; utilisé par le module de sécurité. |
AuthorizeRequest | Signale que la demande est prête à être autorisée ; utilisé par le module de sécurité. |
ResolveRequestCache | Utilisé par le module de cache de sortie pour court-circuiter le traitement des demandes qui ont été mises en cache. |
AcquireRequestState | Signale qu'un état par demande doit être obtenu. |
PreRequestHandlerExecute | Signale que le gestionnaire de demande est sur le point de s'exécuter. Il s'agit du dernier événement auquel vous pouvez participer avant l'appel du gestionnaire HttpHandler pour cette demande. |
Le tableau suivant montre les événements déclenchés après le retour d'une application. Les événements sont répertoriés dans l'ordre dans lequel ils se produisent.
Événement | Description |
---|---|
PostRequestHandlerExecute | Signale que le gestionnaire HttpHandler a fini de traiter la demande. |
ReleaseRequestState | Signale que l'état de la demande doit être stocké parce que l'application en a terminé avec la demande. |
UpdateRequestCache | Signale que le traitement du code est achevé et que le fichier est prêt à être ajouté au cache ASP.NET. |
EndRequest | Signale la fin de tous les traitements pour la demande. Il s'agit du dernier événement appelé lorsque l'application se termine. |
En outre, trois événements par demande peuvent être déclenchés dans un ordre non déterminé. Ces événements sont présentés dans le tableau ci-dessous.
Événement | Description |
---|---|
PreSendRequestHeaders | Signale que des en-têtes HTTP sont sur le point d'être envoyés au client. Ceci permet, avant que les en-têtes ne soient envoyés, de procéder à des ajouts, des suppressions ou des modifications. |
PreSendRequestContent | Signale qu'un contenu est sur le point d'être envoyé au client. Ceci donne la possibilité de modifier le contenu avant son envoi. |
Application_Error | Signale une exception non gérée. |
Événements de module
Vous pouvez vous connecter à des événements qui sont publiés par les modules HttpModule définis dans une configuration. Par exemple, Machine.config
déclare les modules par défaut suivants pour toutes les applications.
<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>
Dans n'importe laquelle de ces classes, recherchez les événements publics qu'elles définissent. Vous pouvez vous connecter à ces événements dans Global.asax en utilisant la syntaxe NomModule**_On**NomÉvénement. Par exemple, l'événement Start du module SessionStateModule est déclaré protected void Session_Start(Object sender, EventArgs e)
dans Global.asax. Vous pouvez utiliser la syntaxe Session_OnStart dans un bloc <script runat=server>
à l'intérieur d'un fichier d'application ASP.NET pour définir un gestionnaire d'événements pour l'événement Start de SessionStateModule de la manière suivante.
<script language="VB" runat="server">
Sub Session_OnStart()
' Session startup code goes here.
End Sub
</script>
Remarque Vous pouvez tout aussi facilement utiliser la même syntaxe NomModule**_On**NomÉvénement pour vous connecter à des événements dans vos propres modules personnalisés, à condition qu'ils soient déclarés dans le fichier de configuration de votre application.
Événements asynchrones
Vous devez connecter explicitement les gestionnaires d'événements pour les événements asynchrones dans HttpApplication en appelant la méthode AddNomÉvénementAsynchrone dans Global.asax. Par exemple, un gestionnaire d'événement asynchrone pour l'événement OnPostRequestHandlerExecuteAsync
s'inscrit pour cet événement en appelant la méthode AddOnPostRequestHandlerExecuteAsync(System.Web.BeginEventHandler
, System.Web.EndEventHandler)
. La syntaxe Application**_On**NomÉvénement de raccourci est réservée aux événements synchrones. Les déclarations pour les événements asynchrones HttpApplication sont les suivantes.
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)
Voici un exemple de bloc de code que vous pouvez inclure dans Global.asax afin de créer un gestionnaire asynchrone pour l'événement 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>
Voir aussi
Prise en charge du runtime HTTP | HttpModules | Exemple de module HttpModule personnalisé | Gestion et déclenchement d'événements