进入MVC处理通道

  

首先来看一下经典的Asp.net处理管道的生命周期。

, 进入MVC处理通道

我们知道一个ASP。净应用程序可以有多个step,但是只能有一个HttpHandler,并且通过这个HttpHandler的BeginProce * * *装备(或过程* * *装备)来处理并返回请求,查看声明处理管道周期可知在MapHttpHandler这个周期将会根据请求的URL来查询对应的HttpHandler,那么它是如何查找的呢。

查找系统web . config中的httpModules配置节,在倒数第二行发现一个名字为UrlRoutingModule - 4.0的IHttpModule配置,这是查找HttpHandler的关键之处。下面分析一下UrlRoutingModule的代码:

<>之前,,,,protected  virtual  void  Init (HttpApplication 应用程序),{,,,,,,,if  (application.Context.Items [_contextKey], !=, null),{,,,,,,,,,,,返回;      ,,,,,,,}      ,,,,,,,application.Context.Items [_contextKey],=, _contextKey;      ,,,,,,,application.PostResolveRequestCache  +=, OnApplicationPostResolveRequestCache;      ,,,},,,,private  void  OnApplicationPostResolveRequestCache (object ,发送方,EventArgs  e), {      ,,,,,,,HttpApplication  app =, (HttpApplication)发送者;      ,,,,,,,HttpContextBase  context =, new  HttpContextWrapper (app.Context);      ,,,,,,,PostResolveRequestCache(上下文);      ,,,},,,,public  virtual  void  PostResolveRequestCache (HttpContextBase 上下文),{      ,,,,,,,RouteData  RouteData =, RouteCollection.GetRouteData(上下文);      ……      ,,,,,,,IRouteHandler  routeHandler =, routeData.RouteHandler;      ,,,,,,,……      ,,,,,,,RequestContext  RequestContext =, new  RequestContext(上下文,routeData);      ,,,,,,,context.Request.RequestContext =, requestContext;      ,,,,,,,IHttpHandler  httpHandler =, routeHandler.GetHttpHandler (requestContext);      ,,,,,,,……      ,,,,,,,context.RemapHandler (httpHandler);      }

可以看到UrlRoutingModule设置了一个PostResolveRequestCache事件处理方法,该方法从RouteCollection通过匹配找到请求对应的路由数据RouteData(包含如Mvc中名的控制器,操作名等),然后从RouteData的属性RouteHandler获取一个IRouteHandler的实例,再从IRouteHandler实例里获取对应的IHttpHandler实例,最后调用HttpContext的RemapHandler方法重新为HttpContext设置RemapHandlerInstance。

根据前面asp.net初始化流程分析2我们知道在获取Httphandler时经典模式和集成模式使用了不同的IExecutionStep,经典模式用的是MapHandlerExecutionStep集成模式用的是MaterializeHandlerExecutionStep,查看二者的执行方法执行。

先看MaterializeHandlerExecutionStep。

<>之前,,,,void  IExecutionStep.Execute (), {      ,,,,,,,HttpContext  context =, _application.Context;      ,,,,,,,HttpRequest  request =, context.Request;      ,,,,,,,IHttpHandler  handler =,零,,,,,,,,,string  configType =,空;      ,,,,,,,……,,,,,,,,if  (context.RemapHandlerInstance  !=, null) {      ,,,,,,,,,,,wr.SetScriptMapForRemapHandler ();      ,,,,,,,,,,,context.Handler =, context.RemapHandlerInstance;      ,,,,,,,}      ……      }

可以看到MaterializeHandlerExecutionStep中如果UrlRoutingModule模块中在HttpContext设置了RemapHandlerInstance,则直接用RemapHandlerInstance设置HttpContext的处理程序。

再看MapHandlerExecutionStep。

<>之前,,,,void  IExecutionStep.Execute (), {      ,,,,,,,HttpContext  context =, _application.Context;      ,,,,,,,HttpRequest  request =, context.Request;      ,,,,,,,……      ,,,,,,,context.Handler =, _application.MapHttpHandler (request.RequestType,上下文,还以为,request.FilePathObject, request.PhysicalPathInternal,, false /* useAppConfig */);      ,,,,,,,……      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

进入MVC处理通道