Cette assembly apporté par le .NET 3.5 SP1 principalement pour ASP.NET MVC et Dynamic Data nous permet d’écrire nos Url’s dans le format de notre choix. L’utilisation de cette assembly va de pair avec “System.Web.Abstraction” utilisée par “System.Web.Routing” dans l’encapsulation du HttpContext dans un HttpContextWrapper et représenté dans un HttpContextBase dans un object RequestContext :
Son utilisation et implémentation est extrêmement simple et elle commence par l’ajout d’une référence à l’Assembly “System.Web.Routing” et “System.Web.Abstraction” et la spécification du HttpModule analysant les Url’s à la source dans la configuration (version IIS 6) :
<httpModules>
<add name="RoutingModule"
type="System.Web.Routing.UrlRoutingModule,System.Web.Routing,Version=3.5.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
L’étape suivante consistera à créer une classe permettant de résoudre le HttpHandler de la réponse. Pour que cette classe puisse être utilisé par la table de routage, elle doit implémenter l’interface “System.Web.Routing.IRouteHandler” :
public class PageRouteHandler : IRouteHandler
{
public string UrlFormat { get; set; }
public PageRouteHandler(string urlFormat)
{
this.UrlFormat = urlFormat;
}
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
{
string vp = string.Format(this.UrlFormat, requestContext.RouteData.Values["page"]);
return (IHttpHandler)BuildManager.CreateInstanceFromVirtualPath(vp, typeof(IHttpHandler));
}
}
Cette classe va donc nous permettre de résoudre le chemin virtuel d’une page grâce à un format de base et à l’information “page” située dans les valeurs de “RouteData” résultat du parsing de l’url. Afin de suivre la méthodologie de ASP.NET MVC, on va maintenant utiliser les méthodes d’extensions pour ajouter simplement un format à la table de routage :
public static class PageRouteExtentions
{
public static void MapPage(this RouteCollection routes, string routeName, string serverFormat, string clientUrl)
{
routes.Add(routeName, new Route(clientUrl, new PageRouteHandler(serverFormat)));
}
}
Grâce à cette méthode d’extension, il devient très aisé d’enregistrer une route :
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapPage("Base", "~/{0}.aspx", "{page}.php");
…
Comme on le voit, le paramètre “page” est entouré de 2 accolades dans l’url client, c’est une règle permettant à la Route de résoudre le format de notre url. Il y a pleins d’autres options, comme des contraintes de formats, des valeurs attachées à la routes dans rapport à l’url, des valeurs par défaut…
On notera que l’objet “System.Web.Routing.RouteDataDictionary” utilisé pour toutes les valeurs d’une “System.Web.Routing.RouteData” à la particularité d’avoir un constructeur permettant de scanner un objet par réflexion pour obtenir clef/valeur de chaque propriété. Cette méthode est très répandue dans l’ASP.NET MVC, elle permet de faire usage à volonté des objets anonymes.