MVC5路由扩展

  上一篇提到,任何一个请求最终都是由Handler处理的,MVC的请求最终是由MvcHandler处理的。由源码可以看出,产生的httphandle是来自GetRouteData方法的,

 

  在Global的Application_Start方法中会进行路由的注册,RegisterRoutes对象是向路由集合中添加我们定义的路由方式,可以通过Add(string name, RouteBase item)方法或者RouteCollectionExtensions对象的MapRoute方法(MapRoute方法是一个扩展方法本质最后也是调用了一个RouteCollection.Add方法)添加自定义路由Route(继承自RouteBase)。在注册路由时,从MapRoute方法中我们可以看到,是将一个Route添加到RouteCollection集合中去,而Route的创建是new了一个MvcRouteHandler。在MvcRouteHandlerGetHttpHandler方法中返回的就是一个MvcHandler(当然也可以自定义处理HttpHandler)。所以可以得出一个MVC的请求最终就是由MvcHandler处理的。

 

  通过下图解释一下上述过程,MVC的网站启动,在Application_Start里面注册路由(就是一个个的URL规则),MvcRouteHandler里面负责生产IHttphandler(其实就是一个MvcHandler)然后放到一个集合中去,在网站接收到一个请求的时候,会创建一个httpApplication对象对按顺序执行22个事件,其中在UrlRoutingModule里面为PostResolveRequestCache事件添加动作,在这个方法里面根据请求的URL从路由集合中找到IHttpHandler(其实就是对应处理的MvcHanler)。

【MvcHandler是怎样响应请求的】

  MvcHandler的ProcessRequest方法调用ProcessRequestInit方法得到一个控制器和控制器工厂

  ProcessRequestInit方法中调用自身ControllerBuilder属性的GetControllerFactory方法获得一个工厂实例,再由这个工厂实例去创建控制器实例

 

ControllerBuilder.Current返回的是一个静态的ControllerBuilder实例,在MvcHandler里就有一个全局的唯一的ControllerBuilder属性

  在得到控制器实例之后,接下来就是调用IController的Execute方法。

Controller是继承自ControllerBase,ControllerBase实现了IController的Execute方法,最后调用ExecuteCore方法

 

Controller里面实现了ControllerBase的ExecuteCore方法,从路由信息里面得到方法名称,然后调用InvokeAction方法传递控制器和方法名。

在有了类的实例--方法名称之后,就可以反射调用方法,在调用前还可以查看特性,执行特性的一些东西。

在权限认证之后,调用InvokeActionResultWithFilters方法,执行顺序是OnActionExcuting--方法--OnActionExcuted

 

posted @ 2018-10-16 16:40  这个年纪的人  阅读(97)  评论(0)    收藏  举报