Avec IIS 7.0, Asp.Net fait partie intégrante du pipeline de traitement d’une requête IIS. Dans la version 6.0, Asp.Net n'était qu'une application autonome sous forme de filtre ISAPI.
Qu’est ce que cela signifie ?
Cette intégration dans le processus de traitement IIS permet aux modules ASP.Net d’accéder à des fonctionnalités serveur non disponibles jusqu'à présent.
IIS 6.0 obligeait parfois à écrire du code d’extensibilité IIS natif, généralement en C/C++, ce n’est plus le cas avec IIS, nous pouvons traiter tous les événements avec Asp.net en code managé.
Nous pouvons aussi maintenant bénéficier des fonctionnalités Asp.Net pour des types de pages qui n’étaient pas traitées par le filtre ISAPI Asp.Net de IIS 6 (Authentification par formulaire, mise en cache, réécriture d’Url, etc…)
On retrouve 22 événements dans le cycle de traitement.
Evénement de la pipeline IIS7
Voici la liste des événements déclenchés par le pipeline de IIS 7.
-
BeginRequest : Appelé lors de la réception de la requête
-
AuthenticateRequest : Appelé pour établir l’identité de l’utilisateur appelant l’application.
-
PostAuthenticateRequest : Appelé immédiatement après l’identification.
-
AuthorizeRequest : Appelé pour vérifier que l’utilisateur peut accéder a un page particulière.
-
PostAuthorizeRequest : Appelé après que l’utilisateur ai été autorisé.
-
ResolveRequestCache : Appelé pour rechercher/retourner une page depuis le cache.
-
PostResolveRequestCache : Appelé après la recherche de la page dans le cache.
-
MapRequestHandler : Initialise le HttpHandler devant traiter la requête dans System.Web.HttpContext.Current.
-
PostMapRequestHandler : Appelé après l’initialisation du HttpHandler.
-
AcquireRequestState : Déclenché que Asp.Net récupère l’état associé a la requête comme la session.
-
PostAcquireRequestState : Déclenché après que Asp.Net ai chargé l’état de la requête.
-
PreRequestHandlerExecute : Appelé juste avant que le HttpHandler traite la requête.
-
PostRequestHandlerExecute : Appelé après que le HttpHandler ait traité la requête.
-
ReleaseRequestState : Appelé avant que l’application ait nettoyé les informations d’état dans HttpContect.Current.
-
PostReleaseRequestState : Appelé après que l’application ait nettoyé les informations d’état dans HttpContect.Current.
-
UpdateRequestCache : Permet au module de mettre en cache la réponse.
-
PostUpdateRequestCache : Appelé après la mise en cache de la réponse.
-
LogRequest : Permet au module de logger des informations.
-
PostLogRequest : Appelé après que l’application ai put loguer des informations.
-
EndRequest : Appelé après que la requête ai été traitée.
-
PreSendRequestContent : Autorise la modification du contenu avant l’envoie de la réponse.
-
PreSendRequestHeaders : Autorise la modification de l’entête http avant l’envoie.
Vérification par l’exemple
Afin de vérifier cela, je vous propose d’écrire un HttpModule qui s’inscrit à tous les événements de la pipeline IIS7 et écrit des informations sur dans la « Response stream ».
Pour le tester nous créons un site web simple composé d’une page Aspx, d’un HttpModule et du web.config (pour le tester il faut le déployer sur un IIS 7)
Page Aspx
Pour cela nous créons une page Aspx simple avec le code suivant :
HttpModule
Nous créons un HttpModule avec le code suivant :
using System;
using System.Collections.Generic;
using System.Web;
/// <summary>
/// Description résumée de DisplayEventsHttpModule
/// </summary>
public class DisplayEventsHttpModule : IHttpModule
{
//Class "Helper" utilisée pour écrire les
// évenement dans "Response"
class ModuleEventHandler
{
private readonly String _eventName;
public ModuleEventHandler(String eventName)
{
_eventName = eventName;
}
public void HandleEvent(Object sender, EventArgs e)
{
HttpContext.Current.Response.Write(String.Format("<font color='green'><strong>{0}</strong></font><br />", _eventName));
}
}
//List des "event Handler"
private readonly List<ModuleEventHandler> _handlers = new List<ModuleEventHandler>();
ModuleEventHandler AddHandler(ModuleEventHandler handler)
{
this._handlers.Add(handler);
return handler;
}
#region IHttpModule Membres
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += this.AddHandler(new ModuleEventHandler("AcquireRequestState")).HandleEvent;
context.AuthenticateRequest += this.AddHandler(new ModuleEventHandler("AuthenticateRequest")).HandleEvent;
context.AuthorizeRequest += this.AddHandler(new ModuleEventHandler("AuthorizeRequest")).HandleEvent;
context.BeginRequest += this.AddHandler(new ModuleEventHandler("BeginRequest")).HandleEvent;
context.Disposed += this.AddHandler(new ModuleEventHandler("Disposed")).HandleEvent;
context.EndRequest += this.AddHandler(new ModuleEventHandler("EndRequest")).HandleEvent;
context.Error += this.AddHandler(new ModuleEventHandler("Error")).HandleEvent;
context.LogRequest += this.AddHandler(new ModuleEventHandler("LogRequest")).HandleEvent;
context.MapRequestHandler += this.AddHandler(new ModuleEventHandler("MapRequestHandler")).HandleEvent;
context.PostAcquireRequestState += this.AddHandler(new ModuleEventHandler("PostAcquireRequestState")).HandleEvent;
context.PostAuthenticateRequest += this.AddHandler(new ModuleEventHandler("PostAuthenticateRequest")).HandleEvent;
context.PostAuthorizeRequest += this.AddHandler(new ModuleEventHandler("PostAuthorizeRequest")).HandleEvent;
context.PostLogRequest += this.AddHandler(new ModuleEventHandler("PostLogRequest")).HandleEvent;
context.PostMapRequestHandler += this.AddHandler(new ModuleEventHandler("PostMapRequestHandler")).HandleEvent;
context.PostReleaseRequestState += this.AddHandler(new ModuleEventHandler("PostReleaseRequestState")).HandleEvent;
context.PostRequestHandlerExecute += this.AddHandler(new ModuleEventHandler("PostRequestHandlerExecute")).HandleEvent;
context.PostResolveRequestCache += this.AddHandler(new ModuleEventHandler("PostResolveRequestCache")).HandleEvent;
context.PostUpdateRequestCache += this.AddHandler(new ModuleEventHandler("PostUpdatePRequestCache")).HandleEvent;
context.PreRequestHandlerExecute += this.AddHandler(new ModuleEventHandler("PreRequestHandlerExecute")).HandleEvent;
context.PreSendRequestContent += this.AddHandler(new ModuleEventHandler("PreSendRequestContent")).HandleEvent;
context.PreSendRequestHeaders += this.AddHandler(new ModuleEventHandler("PreSendRequestHeaders")).HandleEvent;
context.ReleaseRequestState += this.AddHandler(new ModuleEventHandler("ReleaseRequestState")).HandleEvent;
context.ResolveRequestCache += this.AddHandler(new ModuleEventHandler("ResolveRequestCache")).HandleEvent;
context.UpdateRequestCache += this.AddHandler(new ModuleEventHandler("UpdateRequestCache")).HandleEvent;
}
#endregion
}
Web.config
On ajoute les lignes suivantes au web.config :
Résultat
Le résultat obtenu est :
Pour la source c"est ici : Demo IIS7.zip (3,07 kb)
On voit donc clairement la liste et l’ordre des événements qui sont déclenchés par le traitement d’une page Asp.Net dans IIS 7.
Source :