Routing ASP.NET 4.0 sous IIS 5.1/6.0

Comment faire fonctionner le routing ASP.NET 4.0 sous IIS 5.1 / 6.0 ?
Introduction
Si vous avez suivi le tutorial consacré à l'utilisation du routing ASP.NET 4.0 avec WinForms et que vous avez tenté de déployer votre solution sous une version de IIS inférieure à 7.0, vous aurez certainement rencontré un problème d'erreur 404 - Page non trouvée.

Le problème
Le problème provient du fait que IIS 5.1 (la version fournie nativement avec Windows XP Pro) et IIS 6.0 se basent sur les extensions de pages pour décider de quelle manière celles-ci doivent être traitées (ce sont les fameux filtres ISAPI). Or, les routes définies dans notre projet ne contiennent plus d'extensions. Ce qui fonctionne très bien dans IIS7 et dans le serveur de développement de VS2010.

La solution
Une solution possible consiste à inclure une extension .aspx dans la déclaration de vos routes. Evidemment, ce workaround met à mal le concept de friendly-urls qui est quand même le but recherché quand on fait du routing d'URL.

L'autre solution consiste à associer aspnet_isapi.dll avec toutes les extensions de fichiers. Celà affectera légèrement les performances de votre site web car même les ressources statiques seront traitées par ASP.NET, ce qui n'est pas dramatique en soit puisqu'il dispose d'un handler HTTP de base.


Pour associer aspnet_isapi.dll aux pages sans extension :

  1. Démarrez Windows Explorer
  2. Cliquez-droit sur My Computer
  3. Choisir Manage
  4. Dépliez votre site sous Internet Information Services
  5. Faites un clic-droit sur celui-ci
  6. Dans l'onglet Home Directory, cliquez sur Configuration
  7. Cliquez sur Add (ou Insert sous IIS 6.0)
  8. Dans le champ Executable, entrez C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll
  9. Dans le champ Extensions, entrez .*
  10. Décochez l'option Check that file exists
  11. Faites OK pour valider


Après cette manipulation, un autre problème survient sous IIS 5.1/6.0 : la page Default.aspx ne fonctionne plus. Pour résoudre ce problème, ajoutez simplement une route dans le Global.asax.cs pour mapper la racine de votre site avec la page par défaut :


protected void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("Root", "", "~/Default.aspx");
...
}

Commentaires

Petite astuce supplémentaire pour les utilisateurs de Windows XP qui veulent bénéficier des fonctionnalités de IIS 7.5 : installer IIS Express comme serveur de développement.
Sous IIS 6.0, il n'est pas possible d'entrer .* dans le champ Extension. Vous devez cliquez sur le bouton Insert dans l'onglet Mappings et ajouter aspnet_isapi.dll dans la liste "Wildcard application maps". Ne pas oublier de décocher l'option "Verify that file exist".