ASP.NET MVC Route 由浅入深系列之五:路由是如何匹配的

WEB FORM 路由匹配原理

  前面我们通过一个实例介绍了在.NET WEB FORM中如何使用路由,以此来达到访问URL和物理文件的逻辑分离。那么.NET 框架又是如何维系它们的映射关系呢?ASP.NET 是如何根据这个映射"找到"对应的物理文件呢?下面会给出答案。

1路由映射关系的维护 

 在<>中,我们知道了如何为WEB FORM 应用程序添加路由,当我们在用 RouteTable.Routes.MapPageRoute()方法时,实际上是RouteCollection在完成实际的工作。下面是RouteTable类和RouteCollection类的源代码:


RouteTable.cs


RouteCollection.cs

  从上面我们可以清楚的看到,RouteTable采用单例模式,它的静态成员RouteCollection保存了当前应用程序的路由映射。 RouteCollection是一个集合类,继承于Collection类。从名字看得出来,  RouteBase是Route的父类。

   调用RouteTable.Routes.MapPageRoute(),首先会转到 调用静态成员RouteCollection的多个同名的重载MapPageRoute(),接着在MapPageRoute()里再调用Add()方法,这样就把一个名为Name的路由增加进了RouteCollection。

  这里我们需要理解的是RouteTable为什么要采用单例模式。这是因为整个WEB应用程序中,我们只需要一个路由集合的实例,而且有且只存在一个路由集合。

  2 路由映射关系的查找

  当我们在浏览器中输入要访问的URL时,此时我们的请求会进入ASP.NET的“管道”处理程序(后面会写一篇的文章总结),在这个处理程序里,ASP.NET会遍历RouteCollection集合,找出符合条件的Route返回。下面是RouteCollection的关键代码:


RouteCollections的GetRoutedata方法

  上面有一句很关键的代码:

foreach (RouteBase route in this) 

 {

   RouteData routeData = route.GetRouteData(httpContext);

   ........ 省略其他代码

  }

  这是在遍历RouteCollection的每一个Route类,然后将HttpContext作为参数,调用Route的GetRouteData()方法,从而获取匹配的Route.如果在RouteCollection里有符合要求的Route,就立即返回,否则返回空值NULL。

下面继续看下Route的GetRouteData方法发生了什么:


Route的GetRouteData方法

  参看上面的注释,这个方法首先:比对Defaults路由值 ,然后是匹配约束,最后是处理DataTokens.

   以上,我们就总结了路由映射关系的维护和路由映射关系的查找,其中有些细节还需要详细的探讨,例如在Route的GetRouteData方法实际调用的是ParsedRoute类的Match方法进行路由匹配的,这里面是怎样处理的?接下来我们会有后续文章分享,期待!

你可能感兴趣的:(ASP.NET MVC Route 由浅入深系列之五:路由是如何匹配的)