I've been looking at the routing infrastructure Microsoft are releasing in .NET 3.5 SP1. This is the infrastructure that allows me to bind an HTTP Hander to a URI rather than simply using webforms. It is used in the ASP.NET MVC framework that is in development. The infrastructure is pretty clean in design, First you add a reference to System.Web.Routing. Then you simply create Route objects binding a URI to an implementation of IRouteHandler. Finally you add it to a RouteTable static class. Global.asax is the ideal spot for this code.
void Application_Start(object sender, EventArgs e) { Route r = new Route("books", new BooksRouteHandler()); RouteTable.Routes.Add(r); r = new Route("books/isbn/{isbn}", new BooksRouteHandler()); RouteTable.Routes.Add(r); r = new Route("search/price", new SearchRouteHandler()); RouteTable.Routes.Add(r);}
Here BooksRouteHandler and SearchRouteHandler implement IRouteHandler
public interface IRouteHandler{ IHttpHandler GetHttpHandler(RequestContext requestContext);}
So for example the BooksRouteHandler looks like this
public class BooksRouteHandler : IRouteHandler{ public IHttpHandler GetHttpHandler(RequestContext requestContext) { if (requestContext.RouteData.Values.ContainsKey("isbn")) { string isbn = (string)requestContext.RouteData.Values["isbn"]; return new ISBNHandler(isbn); } else { return new BooksHandler(); } }}
Where ISBNHandler and BooksHandler both implement IHttpHandler
This is all pretty straightforward. The one thing that had me puzzling for a while is who looks at the RouteTable. Reflector to the rescue! There is a module in the System.Web.Routing assembly called UrlRoutingModule. If you add this in to your web.config the routing starts working. The config piece looks like this
<httpModules> <add name="Routing" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></httpModules>
Remember Me