首先如果您需要在项目中使用在ASPNET Routing的功能则需要在nfig文件中配置一个HttpModule
<add name=UrlRoutingModule type=SystemWebRoutingUrlRoutingModule SystemWebRouting>
其次您应该在Application_Start中向RouteCollection类型的RouteTableRoutes集合中添加一系列RouteBase对象并为每个RouteBase对象指定一个独立的名称(大小写无关)当然您也可以在运行时动态添加或删除内容(RouteCollection对象是线程安全的)只不过我们平时不太会去这么做而已值得注意的是RouteCollections里的RouteBase对象它们的顺序是非常重要的
UrlRouteModule会监听ASPNET Request Pipelines的PostResolveRequestCache事件在这个事件中UrlRouteModule会将当前的HttpContext作为参数调用RouteTableRoutes集合的GetRouteData方法在RouteCollection的GetRouteData方法中又会依次将HttpContext传入每一个RouteBase对象的GetRouteData方法如果中途某个RouteBase对象返回了一个非null的结果则这个结果便会直接返回给UrlRouteModule
如果UrlRouteModule调用RouteTableRoutesGetRouteData方法得到了null则一切都像没有发生过如果GetRouteData方法得到了结果——一个RouteData对象此时RouteDataValues便会包含请求中捕获到的数据RouteData中另一个重要的成员便是RouteDataRouteHandler属性它返回一个IRouteHandler对象IRouteHandler接口中只有一个方法GetHttpHandler它接受RequestContext作为参数并返回一个IHttpHandler对象如ASPNET MVC框架在利用ASPNET Routing时便会使用MvcRouteHandler来返回一个MvcHandler对象
不过UrlRouteModule在得到了IRouteHandler对象之后并不会直接调用其GetHttpHandler方法而是判断它是不是ASPNET Routing自带的StopRoutingHandler类型StopRoutingHandler是个特殊的IRouteHandler对象它的作用只是告诉UrlRouteModule虽然某个规则匹配成功了但是——也还是当什么都没发生过吧因此如果我们想要跳过一些形式的请求往往则需要将忽略功能放在其他所有规则之前如
public static void RegisterRoutes(RouteCollection routes)
{
routesIgnoreRoute({resource}axd/{*pathInfo});
routesIgnoreRoute(scripts/{*pathInfo});
routesIgnoreRoute(images/{*pathInfo});
routesMapRoute(
Default// Route name
{controller}/{action}/{id} // URL with parameters
new { controller = Home action = Index id = }// Parameter defaults
);
}
IgnoreRoute是定义在ASPNET MVC中基于RouteCollection类型的扩展方法它会向RouteCollection中添加一个Route对象而这个Route对象在匹配成功时返回的RouteData对象其RouteHandler属性便为一个StopRoutingHandler于是余下的Routing规则也不会继续匹配了——这一点和RouteBase对象返回null不同因为如果返回null则余下的规则还会依次匹配如果返回了一个包含StopRoutingHander的RouteData则剩下的Routing规则全部跳过
如果UrlRouteModule得到的IRouteHandler对象不是StopRoutingHandler则便会通过其GetHttpHandler方法获得那个IHttpHandler对象这个IHttpHandler对象会被放入HttpContext的Items集合中至此Request Pipeline的PostResolveRequestCache事件便结束了
UrlRouteModule还会监听PostMapRequest事件此时Module便会查找HttpContextItems集合的特定位置中是否包含一个IHttpHandler对象如果存在则会将这个对象设为当前HttpContext对象的Handler属性的值于是当ASPNET继续执行下去时便会调用这个Handler的ProcessRequest方法来处理请求了
如果这个IHttpHandler对象是MvcHttpHandler那么它便会从RouteData中获取一些数据构造Controller对象执行Action等等如果它是一个DynamicDataHandler或是WebForm的HttpHandler那么剩下的便是各自的模型的处理方式了
因此ASPNET Routing是一个通用的组件它不涉及到任何具体的请求处理方式如果您需要也可以自己基于它进行开发——如FubuMvc项目就是这么做的