首页 > 代码库 > asp.net与MVC4的路由原理和过程【学习笔记】

asp.net与MVC4的路由原理和过程【学习笔记】

当IIS收到一个http请求,把请求信息发给对应的HttpModel(实际是实现类UrlRoutingModule),在HttpModel中会注册HttpApplication 类中的PostResolveRequestCache事件,通过此事件来动态选择映射HttpHandler处理程序。通过匹配到的RouteData类的RouteHandler属性得到IRouteHandler对象(MVC4MvcRouteHandlerasp.net原生的是PageRouteHandler),通过这个对象的GetHttpHandler方法就可以得到HttpHandler处理程序。具体代码如下:

public virtual void PostResolveRequestCache(object sender, EventArgs e) {   HttpApplication app = (HttpApplication)sender;       HttpContextBase context = new HttpContextWrapper(app.Context);       //详细见附1       RouteData routeData = http://www.mamicode.com/RouteCollection.GetRouteData(context);>

 

1

RouteCollection.GetHttpHandler方法获取匹配当前路由信息的RouteData,此方法是循环遍历RouteCollection集合并调用集合中RouteBase实现类为Route)的GetRouteData方法,并返回第一个不为NullRoudataRoudata实在RoudataBaseGetRouteData方法中被创建的,详见如下代码:

 public override RouteData GetRouteData(HttpContextBase httpContext) {     string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;     RouteValueDictionary values = _parsedRoute.Match(requestPath, Defaults);     if (values == null) {          return null;     }    //为Roudata指定IRouteHandler对象    RouteData routeData = http://www.mamicode.com/new RouteData(this, RouteHandler);     >

 

MVC4:动态指定到HttpHandler后,就是处理Controller的创建和Action的执行了

HttpHandler根据Routedata获取到Controller的名称,然后通过ControllerBuilder的静态方法GetControllerFactory获取IControllerFactory的实现类(默认是DefaultControllerFactory )来创建请求的IController的实现类的实例。最后执行IControllerExecute方法并传入请求上下文,方法Execute实现在System.Web.Mvc.ControllerBase这个抽象类中,Execute最终调用的是System.Web.Mvc.Controller中的ExecuteCore方法,ExecuteCore方法主要是保存TempData然后根据路由数据调用执行Action。代码如下:

 

protected override void ExecuteCore(){   PossiblyLoadTempData();   try   {      string actionName = GetActionName(RouteData);      if (!ActionInvoker.InvokeAction(ControllerContext, actionName))      {           HandleUnknownAction(actionName);      }   }    finally    {        PossiblySaveTempData();    }}

 

asp.net与MVC4的路由原理和过程【学习笔记】