之所以说MVC
框架很灵活,在于其扩展性很强,几乎在请求处理管道的任何一个节点都可以扩展。本系列文章将会对扩展点进行总结整理,以此增强对MVC
框架的了解。
MVC
是建立在路由系统之上的,所以严格上讲,路由系统并不属于MVC
框架,路由系统是.NET Framework 3.5 SP1
新增的内容,位于System.Web.Routing
命名空间。
下面为ASP.NET MVC
请求处理管道示意图(注:来源于Steven Sanderson
所著《Pro ASP.NET MVC Framework》
一书):
当IIS接收到一个请求后,将按以下步骤进行处理:
1、IIS根据文件类型将请求转交给相应的处理程序,如果属于
ASP.NET
文件,则将请求转发给aspnet_isapi.dll
。(注:在II6和IIS7
上的处理方式是有区别的)2、
HTTP
处理模块UrlRoutingModule
接收到请求后,循环调用其RouteCollection
集合中的RouteBase
对象,找出匹配的RouteBase。3、根据匹配的
RouteBase
对象返回的RoueData
对象,获取RouteHandler
。4、
RouteHandler
返回一个HTTP
处理程序(IHttpHandler
),最终通过此处理程序处理请求,生成应答内容。5.、如果
RouteHandler
为MvcRouteHandler
,并且其返回的HTTP
处理程序为MvcHandler
,则进入到MVC
框架,MvcHandler
对象负责调用适当的控制器和活动方法,生成应答内容。
从上面步骤中可以看出,只有到第五个步骤后才真正进入到MVC
框架,在此之前都是在ASP.NET
的路由系统中。下面介绍这些步骤中涉及到的类型:
1、UrlRoutingModule类
此类事路由系统的核心类,其主要功能是根据请求上下文找出合适的
RouteBase
对象。属性RouteCollection
是一个RouteBase
对象集合,UrlRoutingModule
接收到请求后,循环RouteCollection
集合中的RouteBase
对象,调用其GetRouteData
方法,如果该方法返回的RouteData
对象不为null,则终止循环,将RouteData
对象存入RequestContext
。然后根据RouteData
的RouteHandler
获取合适的IHttpHandler
处理程序。
UrlRoutingModule
实际上是一个ASP.NET
的HTTP 处理模块,所以它通过配置文件的<httpMoudles>
配置节点来添加的。2、RouteTable类
用于存储应用程序的路由集合,静态属性
Routes
返回应用程序的路由集合,它实际等同于UrlRoutingModule
的RouteCollection
属性。通过RouteTable.Routes.Add
方法可以添加自定义的RouteBase
对象。3、RouteBase类
表示一个
ASP.NET
路由的基类,所有的路由都应该继承自此类。
GetRouteData
方法检查传入的HttpContextBase
信息是否符合路由规则,符合则返回一个RouteData
对象,不符合则返回null
,此方法由UrlRoutingModule
类在循环RouteTable.Routes
集合时调用。
GetVirtualPath
方法根据路由数据生成相应的Url
。4、Route类
是
RouteBase
的一个实现,主要添加了几个属性:
Constraints
: 对URL的约束条件
DataTokens
:传递到路由处理程序的自定义值
Defaults
:Url不包含指定参数时得默认值
RouteHandler
:一个路由处理程序(IRouteHandler)5、IRouteHandler接口
路由处理程序接口,包含一个
GetHttpHandler
方法,用于返回一个IHttpHandler
处理程序对象。6、MvcRouteHandler类
Mvc框架实现的一个路由处理程序,其
GetHttpHandler
方法返回一个MvcHandler
对象7、MvcHandler
由
MvcRouteHandler
返回,根据请求信息,调用合适的控制器和方法,生成应答内容。8、StopRoutingHandler类
表示一个“不处理URL的路由处理类”疑惑 比如
MVC
在RouteCollection
类型上扩展了一个IgnoreRoute
方法,用于指示路由系统忽略处理指定的url
。其实现方式是生成一个Route
对象,指定其RouteHandler
属性为一个StopRoutingHandler
对象。9、
IRouteConstraint
接口用于构建
Route.Constraints
属性,表示一个约束条件。Match
方法用于检查url
是否符合路由规则,符合返回true
,否则false
。