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.