Tout dernièrement j'ai déplacé un site Web d'un serveur Windows 2000 avec Framework 1.1 vers un serveur Windows 2003 avec le Framework 2.0.
Ce site Web utilise pour certaines images, un httpHandler car ses images sont stockés dans la BD. Donc dans le web.config de la racine du site on retrouve la configuration nécessaire pour que les fichiers avec l'extension .gif et .jpg passent par le handler (ne pas oublier de mapper ces extensions dans IIS):
<httpHandlers>
<add verb="*" path="*.jpg" type="MyHandler.ImageHandler, MyHandler" />
<add verb="*" path="*.gif" type="MyHandler.ImageHandler, MyHandler" />
</httpHandlers>
Certaines images statiques du site, sont par contre, des images contenues dans des répertoires, alors pour ces répertoires, ont avait un autre fichier web.config qui enlevait le handler particulier pour que ces fichiers soient traités normalement
<httpHandlers>
<remove verb="*" path="*.jpg" />
<remove verb="*" path="*.gif" />
</httpHandlers>
Tout fonctionnait très bien sur le serveur Windows 2000 avec Framework 1.1 mais lorsque l'application a été migré vers Windows 2003 avec Framework 2.0, les images provenant de la BD et traitées par le Handler fonctionnaient correctement mais les images contenus dans des répertoires, elles ne s'affichaient plus.
Après quelques recherches, j'ai découvert qu'il fallait en plus d'enlever (remove ) le handler, il fallait ajouter (add) le handler System.Web.StaticFileHandler
<httpHandlers>
<remove verb="*" path="*.jpg" />
<remove verb="*" path="*.gif" />
<add verb="*" path="*.jpg,*.gif" type="System.Web.StaticFileHandler" />
</httpHandlers>
Pourquoi ça fonctionne pas de la même manière sur les 2 serveurs?
Avec le Framework 1.1 lorsqu'il ni a pas de handler de spécifié, celui par défaut est System.Web.StaticFileHandler.
On peut voir ça dans le machine.config par la ligne suivante:
<add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler" />
alors qu'avec le Framework 2.0, celui par défaut est System.Web.DefaultHttpHandler:
<add path="*" verb="GET,HEAD,POST" type="System.Web.DefaultHttpHandler" validate="True" />