Ene/109
Routing en ASP.NET Web forms
Con el enrutamiento, podemos conseguir transformar las URL de nuestra aplicación para que sean más amigables al usuario, de tal manera, que no tiene porque hacerse referencia al fichero físico (.aspx, .html, …) por ejemplo, si tradicionalmente tenemos una URL del tipo: http://www.dominio.com/Post.aspx?category=7&id=14 podemos conseguir una url de este otro tipo http://www.dominio.com/Post/Eventos/14
Esta característica es una de las ventajas del framework ASP.NET MVC, pero lo que voy a tratar de explicar aquí es como activar esto en una aplicación web site o un proyecto web application. Para poder hacerlo, es necesaria la versión 3.5 SP1 del .NET framework.
Creamos una aplicación web ASP.NET en visual studio 2008. Lo primero que tenemos que hacer es agregarnos una referencia al ensamblado System.Web.Routing, que es quien nos proveerá de toda la funcionalidad de enrutado.
Ahora vamos al fichero web.config, y según con que versión de IIS vayamos a trabajar, debemos agregar las siguientes configuraciones.
- IIS 6.0 o IIS 7.0 en Classic mode
<httpModules> <add name="RoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules>
- IIS 7.0 Integrated mode
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </modules> <handlers> <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </handlers> </system.webServer>
NOTA: para trabajar en local, aunque tengamos IIS 7.0 instalado, recordad que trabajamos con el servidor web de visual studio 2008 (Cassini), y hay que añadir la configuración de los httpModules.
Ahora nos vamos al fichero global.asax (lo añadimos si no lo tenemos), incluimos el using System.Web.Routing y creamos la siguiente función (que llamaremos desde el método Application_Start).
1 2 3 4 5 6 7 | private static void RegisterRoutes() { RouteTable.Routes.Add( "NombreRuta", new Route("nivel1/{cualquiercosa}", new DemoRouteHandler("~/Demo.aspx"))); } |
1 2 3 4 | protected void Application_Start(object sender, EventArgs e) { RegisterRoutes(); } |
Aquí debemos registrar todas las rutas que queramos controlar, por ejemplo, en este caso, solo vamos a capturar las peticiones a las URL del tipo http://server/nivel1/cualquiervalor y lo que haremos será enviar esa petición a la página Demo.aspx.
Si recibimos una petición a una URL que no cumple ningún patrón de los registrados, la aplicación devolverá un error 404.
Nos falta crear la clase DemoRouteHandler que implementa IRouteHandler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | using System.Web; using System.Web.Routing; using System.Web.Compilation; using System.Web.UI; namespace DemoRouting { public class DemoRouteHandler : IRouteHandler { string _virtualPath; public DemoRouteHandler(string virtualPath) { _virtualPath = virtualPath; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { var display = BuildManager.CreateInstanceFromVirtualPath( _virtualPath, typeof(Page)) as IHttpHandler; return display; } } } |
Si creamos la página Demo.aspx, en el Page_Load podemos acceder a la propiedad Url de la propiedad Request de la instancia Page.
Ya tenemos activado el enrutamiento en nuestra aplicación, podemos lanzarla desde vs y comprobarlo accediendo directamente a la url que cumpla el patrón.
Podemos descargar un ejemplo más bonito y completo de msdn magazine y profundizar con las reglas de enrutado en este artículo de msdn.

