Favicon.ico, asp.net mvc et 404

Sur un de mes sites j’ai constaté dans les logs IIS qu’un 404 se produisait car les navigateurs veulent obtenir le fichier favicon.ico, voici une solution pour eviter de renvoyer un 404 :

dans global.asax, ajouter une route :

routes.MapRoute(
"FavIcon"
, @"favicon.ico"
, new { controller = "Home", action = "FavIcon" }
);



dans le controller “HomeController” ajouter l’action FavIcon :




public ActionResult FavIcon()
{
var pixel = new byte[35] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61
, 0x01, 0x00, 0x01, 0x00, 0x80, 0x00, 0x00
, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF
, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00
, 0x02, 0x01, 0x44, 0x01, 0x00
, 0x3B };

return this.File(pixel, "image/gif");
}



le serveur retournera bien une reponse 200 au navigateur avec une image d’un pixel.



A savoir, si le fichier existe, pour eviter de passer par le controller par defaut, il faut ajouter la ligne suivante dans global.asax :




routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });



Une variation pour l’action FavIcon() suite à la juste remarque de Dascritch :




[OutputCache(VaryByParam="none", Duration=3600)]
public ActionResult FavIcon()
{
byte[] result = null;
using (var bitmap = new System.Drawing.Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
{
var backColor = bitmap.GetPixel(0, 0);
bitmap.MakeTransparent(backColor);
using (var ms = new System.IO.MemoryStream())
{
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
result = ms.GetBuffer();
ms.Close();
}
}
return this.File(result, "image/x-icon");
}




Retourne une image au format 16x16 transparent au format PNG, IE ne la prends pas en compte, Firefox est ok et Chrome affiche un carré noir :(

1 commentaire:

Da Scritch a dit…

Eeeeuh, tu es pas codex microsoft, là.
Une favicon, c'est une ressource Windows icone, jamais un .gif

Du moins, pas dans le monde Microsoft