L’objectif de ce tutoriel (deuxième du module 8) est d’apprendre comment créer des handlers et des modules http personnalisés.
Etape 1 : Création d’un handler personnalisé
L’objectif de cette étape est de créer un handler qui gère des extensions spéciales : « datx » et « timx ». Dès que l’utilisateur de l’application tape une url dont l’extension est « datx », l’application lui descend la date d’aujourd’hui. Dès que l’utilisateur tape une url contenant l’extension « timx », l’application lui descend l’heure en cours.
- Ouvrez VS2012
- Créez une application ASP.NET vide appelée « TestExtensionsHTTP »
- Ajoutez un nouvel élément au projet
- Dans la liste des modèles, choisissez « Handler ASP.NET »
- Dans le nom, entrez « DateTimeHandler »
- Cliquez sur « Ajouter »
- La classé générée sera comme suit :
public class DateTimeHandler : IHttpHandler
{
/// <summary>
/// You will need to configure this handler in the Web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: http://go.microsoft.com/?linkid=8101007
/// </summary>
#region IHttpHandler Members
public bool IsReusable
{
// Return false in case your Managed Handler cannot be reused for another request.
// Usually this would be false in case you have some state information preserved per request.
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
//write your handler implementation here.
}
#endregion
}
- La propriété « IsReusable » indique si le handler peut être réutilisé par plusieurs requêtes
- La méthode « ProcessRequest » doit contenir le code permettant de traiter la requête http
- Dans le corps de la méthode « ProcessRequest », entrez les instructions suivantes
var auth = context.Request.Url.GetLeftPart(UriPartial.Path);
var tab = auth.Split('.');
var extension = tab[tab.Length - 1];
if (extension == "datx")
context.Response.Write(DateTime.Now.Date.ToLongDateString());
else
if (extension == "timx")
context.Response.Write(DateTime.Now.ToLongTimeString());
- Ouvrez le fichier « web.config »
- Ajoutez une section « system.webServer »
- Nous allons configurer l’application de façon à ce que tous les documents dans la requête dont l’extension est « datx » ou « timx » soit traitée par « DateTimeHandler »
- Dans « system.webServer », ajoutez les éléments suivants :
<handlers>
<add type="TestExtensionsHTTP.DateTimeHandler" path="*.datx" verb="*" name="datxHandler"/>
<add type="TestExtensionsHTTP.DateTimeHandler" path="*.timx" verb="*" name="timxHandler"/>
</handlers>
- Exécutez en appuyant sur « F5 »
- Remarquez que parce qu’il n’y a aucune forme web dans notre application, un message d’erreur apparaît (code 403)
- Dans la barre d’adresse du navigateur, tapez « Home.datx », par exemple http://localhost:numport/Home.datx
- Remarquez que la date d’aujourd’hui est affichée
- Dans la barre d’adresse du navigateur, remplacez « Home.datx » par « Hom.timx »
- Remarquez que c’est l’heure en cours qui est affichée
Etape 2 : Création d’un module HTTP
Le but de ce tutoriel est de créer un module refusant toutes les URLs contenant le mot « Test » malgré que la page existe. Le module génère alors une erreur 404.
- Ajoutez deux formes web à l’application, l’une appelée « Default.aspx » et l’autre « Test.aspx »
- Dans « Default.aspx », ajoutez un lien hypertexte pointant sur la page « Test.aspx »
- Ajoutez un nouvel élémént
- Dans le modèle, sélectionnez « module ASP.NET »
- Dans le nom, entrez « TestRefuseModule »
- Cliquez sur « Ajouter »
- Remarquez le code généré par VS 2012 :
public class TestRefuseModule : IHttpModule
{
/// <summary>
/// You will need to configure this module in the Web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: http://go.microsoft.com/?linkid=8101007
/// </summary>
#region IHttpModule Members
public void Dispose()
{
//clean-up code here.
}
public void Init(HttpApplication context)
{
// Below is an example of how you can handle LogRequest event and provide
// custom logging implementation for it
context.LogRequest += new EventHandler(OnLogRequest);
}
#endregion
public void OnLogRequest(Object source, EventArgs e)
{
//custom logging logic can go here
}
}
- La méthode « Init » est la méthode permettant d’initialiser les évènements qu’on veut ajouter au cycle de vite de traitement de la requête
- Dans la méthode « Init », ajoutez le code suivant permettant d’affecter un gestionnaire d’évènement à l’évènement « BeginRequest » qui se déclenche au début de traitement de la requête http :
context.BeginRequest += new EventHandler(context_BeginRequest);
- Ajoutez le gestionnaire d’évènements « context_BeginRequest » comme suit :
void context_BeginRequest(object sender, EventArgs e)
{
var ctx = (HttpApplication)sender;
if (ctx.Request.RawUrl.Contains("Test"))
throw new HttpException(404, "Non !");
}
- Le principe du gestionnaire est que dès que l’URL contient le mot « Test », une exception est générée déclenchant l’erreur 404 http malgré l’existence de la ressource
- Appuyez sur « F5 » pour exécuter
- Dans la page d’accueil, cliquez sur le lien et remarquez que l’application s’exécute normalement. Ceci est dû au fait que bien que le module soit finalisé, il fallait le déclarer dans le fichier de configuration pour être intégré par IIS
- Ouvrez le fichier « web.config »
- Dans la section « system.webServer » ajoutez les éléments suivants :
<modules>
<add type="TestExtensionsHTTP.TestRefuseModule" name="testModule"/>
</modules>
- Ré-exécutez l’application et ré-essayer d’appuyer sur le lien dans la page principale
Pour télécharger le code, cliquez ici