Utiliser ASP.NET MVC avec différentes versions de IIS

Pascal ROZE (Traduction)

Dans ce tutoriel, vous allez apprendre comment utiliser ASP.NET MVC, et le routage d'urls, avec différentes versions de IIS. Vous allez apprendre différentes stratégies pour utiliser le framework ASP.NET MVC avec IIS7.0 (en mode classique), IIS6.0 et les versions précédentes de IIS.

- Titre : Utiliser ASP.NET MVC avec différentes versions de IIS

- Auteur : Pascal ROZE (Traduction)

- Parution : 23 avril 2009

- Licence : Copyright ® 2009 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Traduction

- Utiliser le ASP.NET MVC avec différentes versions de IIS

- Mode intégré contre mode classique

- Utiliser ASP.NET MVC avec des versions antérieures de IIS

- Ajouter des extensions à la table de routage

- Serveur hébergé

- Créer un Wildcard Script Map

- Résumé

Traduction

Cet article est la traduction la plus fidèle possible de l'article original: Using ASP.NET MVC with Different Versions of IIS

Utiliser le ASP.NET MVC avec différentes versions de IIS

Le framework ASP.NET MVC dépend du routage ASP.NET pour router les requêtes provenant du navigateur vers les actions du controleur. Dans le but de tirer profit du routage ASP.NET, vous serez peut-être amené à modifier la configuration de votre serveur web. En fait, tout dépend de la version de votre IIS et de la façon dont votre application gère les requêtes.

Voici un résumé des différentes versions de IIS:
- IIS 7.0 (monde intégré) - Aucune configuration spéciale n'est nécessaire pour utiliser le routage ASP.NET
- IIS 7.0 (mode classique) - Vous devez effectuer quelques modifications sur la configuration pour utiliser le routage ASP.NET
- IIS 6.0 ou moins - Vous devez effectuer quelques modifications sur la configuration pour utiliser le routage ASP.NET

La dernière version de IIS est la version 7.0. Cette version de IIS est incluse dans Windows Server 2008. Vous pouvez également installer IIS 7.0 sur n'importe quelle version de Vista, à l'exception de la version Familiale Basique (voir http://technet.microsoft.com/en-us/library/cc732624.aspx)

IIS 7.0 supporte 2 modes de traitement des requêtes. Vous pouvez utilisez le mode intégré ou le mode classique. Vous n'avez pas besoin procéder à certaines modifications de la configuration si vous utilisez IIS 7.0 en mode intégré. Cependant, vous devez le faire si vous utilisez IIS 7.0 en mode classique.

Microsoft Windows Server 2003 contientIIS 6.0. Vous ne pouvez pas installer IIS 7.0 sur un Windows Server 2003. Vous devez procéder à certaines modifications de la configuration si vous utilisez IIS 6.0.

Microsoft Windows XP Professionnal contient IIS 5.1. Vous devez procéder à certaines modifications de la configuration si vous utilisez IIS 5.1.

Pour finir, Microsoft Windows 2000 et Microsoft Windows 2000 Professional contiennent IIS 5.0. Vous devez procéder à certaines modifications de la configuration si vous utilisez IIS 5.0.

Mode intégré contre mode classique

IIS 7.0 peut traiter les requêtes en utilisant 2 modes différents: le mode intégré et le mode classique. Le mode intégré est plus performant et fournit plus de fonctionnalités. Le mode classique est inclus afin d'assurerla retro compatibilité avec les versions antérieures de IIS.

Le mode de traitement des requêtes est déterminé par le pool applicatif. Vous pouvez spécifier quel mode de traitement est utilisé par une application web donnée en spécifiant le pool associé à cette application. Pour cela:
1. Lancez Internet Information Services Manager
2. Dans la fenêtre Connections, sélectionnez une application
3. Dans la fenêtre Actions, cliquez sur le lien Basics Settings pour ouvrir la fenêtre de dialogue Edit Application (voir figure 1)
4. Notez le pool applicatif sélectionné.

Par défaut, IIS est configuré pour supporter 2 pools applicatifs: DefaultAppPool et Classic .NET AppPool. Si DefaultAppPool est sélectionné, alors votre application tourne en mode de traitement des requêtes intégré. Si Classic .NET AppPool est sélectionné, votre application tourne en mode de traitement des requêtes classique.

Figure 1: Détecter le mode de traitement des requêtes

Notez que vous pouvez modifier le mode de traitement des requêtes dans la fenêtre de dialogue Edit Application. Cliquez sur le bouton Select et changez le pool applicatif associé à l'application. Prenez garde au fait qu'il y a des problèmes de compatibilité quand vous passez du mode classique au mode intégré. Pour plus d'information, voir les articles suivants:
- Upgrading ASP.NET 1.1 to IIS 7.0 on Windows Vista and Windows Server 2008 -- http://learn.iis.net/page.aspx/270/upgrading-aspnet-11-to-iis7-on-windows-vista--windows-server-2008/
- ASP.NET Integration With IIS 7.0 - http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis7/

Si une application ASP.NET utilise le DefaultAppPool, alors vous n'avez pas besoin d'effectuer de modifications pour faire fonctionner le routage ASP.NET (et donc ASP.NET MVC). Mais si une application ASP.NET est configurée pour utiliser le Classic .NET AppPool, vous aurez plus de travail de configuration à faire.

Utiliser ASP.NET MVC avec des versions antérieures de IIS

Si vous avez besoin d'utiliser ASP.NET MVC avec une version de IIS antérieure à la 7.0, ou si vous avez besoin d'utiliser IIS 7.0 en mode classique, alors vous avez 2 options. Premièrement, vous pouvez modifier la table de routage pour utiliser les extensions de fichier. Par exemple, au lieu de requêter une url comme /Store/Details, vous pourriez requêter une url comme /Store.aspx/Details.

La seconde option est de créer ce que l'on appelle un wildcard script map. Un wildcard script map vous permet d'envoyer chaque requête vers le framework ASP.NET.

Si vous n'avez pas accès à votre serveur web (par exemple, votre application ASP.NET MVC est hebergée pour un fournisseur d'accès) alors vous aurez besoin d'utiliser la première option. Si vous ne voulez pas modifier l'apparence de vos urls, et que vous avez accès à votre serveur web, alors vous devez utiliser la seconde.

Nous allons explorer chacune de ces options dans les sections suivantes.

Ajouter des extensions à la table de routage

La façon la plus simple de faire fonctionner le routage ASP.NET avec les versions plus anciennes de IIS est de modifier votre table de routage dans le fichier global.asax. Le fichier global.asax par défaut et non modifié du Listing 1 configure une unique route appelée la route Default.

Listing 1 - Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
public class GlobalApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default",                                              // Route name
"{controller}/{action}/{id}",                           // URL with parameters
new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);
}

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}

La route Default configurée dans Listing 1 vous permet de router des urls telles que:
/Home/Index
/Products/Details/3
/Product

Malheureusement, les versions plus anciennes de IIS ne passent pas ces requêtes au framework ASP.NET. Cependant, ces requêtes ne seront pas routées vers un controleur. Par exemple, si vous faites une requête avec l'url /Home/Index, vous aurez l'erreur suivante:

Figure 2. Erreur 404, page non trouvée

Les versions plus anciennes de IIS mappent seulement certaines requêtes vers le framework ASP.NET. La requête doit être une url avec une extension de fichier correcte. Par exemple, une requête sur /SomePage.aspx sera mappée vers le framework ASP.NET. Alors qu'une requête sur /SomePage.html ne le sera pas.

Par conséquent, pour faire fonctionner le routage ASP.NET, nous devons modifier la route Default de manière à ce qu'elle inclus une extension de fichier qui est mappée sur le framework ASP.NET.

Quand vous installez le framework ASP.NET MVC, un script nommé registermvc.wsf est ajouté au dossier suivant: C:\Program Files\Microsoft ASP.NET\ASP.NET MVC\Scripts

L'exécution de ce script enregistera une nouvelle extension .mvc dans IIS. Après cela, vous pouvez modifier vos routes dans le fichier global.asax de façon à ce qu'elles utilisent l'extension .mvc.

Le fichier global.asax modifié dans Listing 2 fonctionne avec les versions plus anciennes de IIS.

Listing 2 - Global.asax (modifié avec les extensions)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default",
"{controller}.mvc/{action}/{id}",
new { action = "Index", id = "" }
);

routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
}

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}

Important: n'oubliez pas de recompiler votre application ASP.NET MVC après chaque modification du fichier Global.asax

Il y a deux changements importants dans le fichier Global.asax du Listing 2. Il y a maintenant 2 routes définies dans le Global.asax. Le modèle d'url pour la route Default, la première route, ressemble maintenant à:
{controller}.mvc/{action}/{id}

L'ajout de l'extension .mvc change le type de fichier que le module de routage ASP.NET intercepte. Avec ce changement, l'application ASP.NET MVC va maintenant router des requêtes telles que:
/Home.mvc/Index/
/Product.mvc/Details/3
/Product.mvc/

La seconde route, la route Root, est nouvelle. Le modèle d'url pour la route Root est une chaine de caractères vide. Cette route est nécessaire pour intercepter les requêtes faites sur la racine de votre application. Par exemple, la route va intercepter une requête telle que:
http://www.YourApplication.com

Après avoir ces modifications sur votre table de routage, vous allez devoir vous assurer que tous les liens de votre application sont compatibles avec ces nouveaux modèles d'url. En d'autres mots, vous assurer que tous les liens contiennent l'extension .mvc. Si vous utilisez la méthode helper Html.ActionLink() pour générer vos liens, alors vous n'aurez à faire aucun changement.

Au lieu d'utiliser le script registermvc.wcf, vous pouvez ajouter manuellement une nouvelle extension à IIS qui sera mappée sur le framework ASP.NET. Lorsque vous ajoutez une nouvelle extension par vous-même, assurez-vous que la case à cocher nommée Verify that file exists n'est pas cochée.

Serveur hébergé

Vous n'aurez pas toujours accès à votre serveur web. Si, par exemple, vous hébergez votre application ASP.NET MVC en passant par un hébergeur, alors vous n'aurez pas nécessairement accès à IIS.

Dans ce cas, vous devriez utiliser une des extensions qui sont mappées sur le framework ASP.NET, telles que les extensions .aspx, .axd et.ashx.

Par exemple, le fichier Global.asax du Listing 3 utilise l'extension .aspx au lieu de l'extension .mvc.

Listing 3 - Global.asax (modifié avec les extensions .aspx)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default",
"{controller}.aspx/{action}/{id}",
new { action = "Index", id = "" }
);

routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
}

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}

Le fichier Global.asax du Listing 3 est exactement le même que le précédent, à l'exception du fait qu'il utilise l'extension .aspx à la place de l'extension .mvc. Vous n'avez ainsi pas besoin de configurer votre serveur web distant pour utiliser l'extension .aspx.

Créer un Wildcard Script Map

Si vous ne voulez pas modifier les urls pour votre application ASP.NET MVC, et si vous avez accès à votre serveur web, alors vous une option supplémentaire. Vous pouvez créer un wildcard script map qui mappera toutes les requêtes sur le serveur web sur le framework ASP.NET. Ainsi, vous pouvez utiliser la la table de routage d'ASP.NET MVC par défaut de IIS 7.0 (en mode classique) ou IIS 6.0.

Soyez bien conscient que cette option implique que IIS interceptera toutes les requêtes envoyées au serveur web. Cela inclut les requêtes pour des images, des pages ASP classiques et les pages HTML. Par conséquent, activer un wilcard script map sur ASP.NET aura des implications en terme de performance.

Voici comment activer un wildcard script map pour IIS 7.0:
1. Sélectionnez votre application dans la fenêtre Connections
2. Assurez vous que la vue Features est sélectionnée
3. Double-cliquez sur le bouton Handler mappings
4. Cliquez sur lien Add Wildcard Script Map (figure 3)
5. Entrez le chemin du fichier aspnet_isapi.dll (vous pouvez copier ce chemin depuis le PageHandlerFactory script map
6. Entrez le nom MVC
7. Cliquez sur le bouton OK

Figure 3: Créer un wildcard script map avec IIS 7.0

Suivant les étapes suivantes pour créer un wildcard script map avec IIS 6.0:
1. Cliquez droit sur un site web et sélectionnez Properties
2. Sélectionnez l'onglet Home Directory
3. Cliquez sur le bouton Configuration
4. Cliquez sur le bouton Insert (Figure 4)
5. Collez le chemin du fichier aspnet_isapi.dll dans le champ Executable
6. Décochez la case Verify that file exists
7. Cliquez sur le bouton OK

Figure 4: Créer un wildcard script map avec IIS 6.0

Après avoir activé les wildcard script maps, vous devez modifier la table de routage dans le fichier Global.asax de façon à inclure une route Root. Sinon, vous obtiendrez l'erreur suivante (figure 5) quand vous ferez une requête sur la page racine de votre application. Vous pouvez utiliser le fichier Global.asax du Listing 4.

Figure 5: Erreur lorsque la route Root est manquante

Listing 4 - Global.asax (modifié avec la route Root)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{

public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { action = "Index", id = "" }
);

routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
}

protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}

Après avoir activé un wildcard script map pour IIS 7.0 ou IIS 6.0, vous pouvez faire des requêtes, qui fonctionnent avec la table de routage par défaut, telles que:
/
/Home/Index
/Product/Details/3
/Product

Résumé

Le but de ce tutoriel était de vous expliquer comment utiliser ASP.NET MVC avec une version antérieure de IIS (ou avec IIS 7.0 en mode classique). Nous avons discuté de deux méthodes pour faire fonctionner le routage d'ASP.NET avec les versions antérieures de IIS: modifier la table de routage ou créer un wildcard script map.

La première option nécessite que vous modifiez les urls utilisées dans votre application ASP.NET MVC. Un des avantages de cette première option est que vous n'avez pas besoin d'avoir accès à votre serveur web pour modifier la table de routage. Cela signifie que vous pouvez utiliser cette première option même si vous passez par un hébergeur pour votre application ASP.NET MVC.

La seconde option est de créer un wildcard script map. L'avantage de cette seconde option est que vous n'avez pas besoin de modifier vos urls. Le désavantage de cette option est que cela a un impact négatif sur les performances de votre application ASP.NET MVC.