Les HttpHandler

NICOLAS HUMANN

N'hésitez pas à commenter cet article ! Commentez ♪♪

- Titre : Les HttpHandler

- Auteur : NICOLAS HUMANN

- Parution : 18 décembre 2013

- Licence : Les sources présentées sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005 Nicolas Humann . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Sommaire

- I. Définitions

- II. Petite histoire du protocole http et du html

- III. Exemple d'utilisation

- IV. Conclusion

- V. Téléchargements

I - Définitions

Un httphandler est une classe qui répond à une requête http alors qu'habituellement, lorsque vous consultez un site asp.net, c'est un page aspx qui est demandé au serveur.

II - Petite histoire du protocole http et du html

Prenons l'exemple d'une image. Dans le code html, chaque balise image a un attribut src, qui correspond à l'url où se trouve l'image. Donc lorsque le navigateur reçoit une page html qui contient des balises images, il fait une nouvelle requête vers le serveur en lui demandant l'image correspondante. Or dans le cas où une image est stockée en base de données, on est bien embêté. C'est pour cela (entre autres) que l'httphandler existe.

III - Exemple d'utilisation

Dans notre exemple, nous allons créer une miniature à partir d'une image et la renvoyer. Pour commencer, rajoutons à notre projet web, une classe qui implémente l'interface IHttpHandler.

public class ImageHandler:IHttpHandler
{
public ImageHandler()
{
}

#region IHttpHandler Members

public bool IsReusable
{
get { return true; }
}

public void ProcessRequest(HttpContext context)
{

}

#endregion
}

Ensuite rajoutons l'Handler dans le web.config à l'intérieur de system.web. Ceci permet de pointer notre classe à une url. Donc lorsque l'on demandera Image.axd, ce sera notre classe qui sera appelée, nous pouvons créer autant de Handler que l'on désire.

<httpHandlers>
<add path="Image.axd" verb="*" type="ImageHandler"  validate="True"/>
</httpHandlers>

Revenons à notre classe. La méthode ProcessRequest est la clé de la classe. C'est cette méthode qui est appelée lors de la requête. On retrouve dans le context tout ce que l'on a besoin. Rajoutons dans cette méthode le bout de code pour réaliser la miniature et la renvoyer.

public void ProcessRequest(HttpContext context)
{
// Recupere le chemin sur le disque
string path = context.Server.MapPath("~/images/");
// Concatenation du path au nom de l'image fourni par la query string
string imageFile = string.Concat(path, context.Request.QueryString["img"]);
// est-ce que le fichier existe ?
if (File.Exists(imageFile) == false)
imageFile = string.Concat(path, "noimg.jpg");
// Chargement de l'image
System.Drawing.Image img = System.Drawing.Image.FromFile(imageFile);
// Resalisation de la miniature en 200x200
img = img.GetThumbnailImage(200, 200, null, new IntPtr());
// Envoi de l'image au client
img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
// Liberer les ressources
img.Dispose();
}

Pour finir n'oublions pas d'ajouter une page aspx et rajoutons une image.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title > Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<img src="Image.axd?img=soleil.jpg" />
</div>
</form>
</body>
</html>

Voilà tout est fait, il ne reste plus qu'à tester. Si on veut changer d'image, il faut changer img=soleil.jpg par une autre image.

IV - Conclusion

Les HttpHandlers sont en effet très utiles, principalement pour renvoyer des informations depuis une base de données. J'espère que ce court tutoriel vous sera utile.

V - Téléchargements

Les sources complètes