Asp.net MVC源码分析--UrlRoutingModule与Service location的亲密接触
这篇文章我们主要探讨UrlRoutingModule 如何截获HttpApplicatioin的管道事件,从而把Http Request 引入Mvc框架中的.分析这个过程需要我们用到UrlRoutingModule 类的源码.
现在我们可以从微软的官方网站下载.Net4.0的源码.
下载地址:http://aspnet.codeplex.com/releases/view/58781
首先我们在生成一个Asp.net MVC3.0 的项目时都会在Global.asax文件中生成一个MvcApplication类,在这个类中我们可以在Application_Start方法中注册我们定义好的的路由规则.
MvcApplication.cs
1 public class MvcApplication : System.Web.HttpApplication
2 {
3 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
4 {
5 filters.Add(new HandleErrorAttribute());
6 }
7
8 public static void RegisterRoutes(RouteCollection routes)
9 {
10 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
11
12 routes.MapRoute(
13 "Default", // Route name
14 "{controller}/{action}/{id}", // URL with parameters
15 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
16 );
17
18 }
19 protected void Application_Start()
20 {
21 AreaRegistration.RegisterAllAreas();
22
23 RegisterGlobalFilters(GlobalFilters.Filters);
24 RegisterRoutes(RouteTable.Routes);
25 }
26 }
27
我们看一下routes.MapRoute的方法实现,在这个方法中我们向RouteTable.Routes全局的路由表中加入我们自定义的路由规则.
RouteCollectionExtensions.cs
这时我们需要注意的是在创建Route对象的时候我们传入的是MvcRouteHandler对象.这个对象在什么时候使用呢? 我们需要查看UrlRoutingModule的源码.
UrlRoutingModule.cs
www.zzzyk.com
我们看到当UrlRoutingModule初始化并调用Init方法的时候注册了HttpApplication的PostResolveRequestCache管道事件,所以当HttpAplication对象(这里是MvcApplication)执行时就会触发PostResolveRequestCache事件,从而把HttpRequest引导进MVC module中,接下来我们看一下Mvc是怎么处理Request的.
我们看到在PostResolveRequestCache方法中有:
RouteData routeData = RouteCollection.GetRouteData(context);
这里会通过GetRouteData找到与当前请求的URL 匹配的RouteData 没有则返回。
RouteCollection.cs
-------------------------------------------------------------------------------------------------
接下来我们看到:
IRouteHandler routeHandler = routeData.RouteHandler;
IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
context.RemapHandler(httpHandler);
以上几句代码完成的就是把我们在Application_Start方法中注册的路由规则取得,然后找到MvcRoutingHandler,再调用GetHttpHandler方法
取到IHttpHandler.
接下来的逻辑是:
1.iis7下把HttpHandler它注册到IIS的workprocesser中.
2.iis6中把HttpHandler放到HttpContext.Handler中.
最终在HttpApplication.PreRequestHandlerExcute后执行这个HttpHandler.
HttpContext.cs/请参照HttpContext.RemapHandler 方法.
-----------------------------------------------------------------------------------------------
下面我们看一下MvcRoutingHandler的源码.我们看到GetHttpHandler 方法最终返回的是MvcHandler对象.也就是终我们放到
HttpContext.Handler 的对象。最终会调用这个Handler.ProcessRequest 方法来处理HttpRequest请求.
MvcRoutingHandler.cs
----------------------------------------------------------------------------------------------
MvcHandler.ProcessRequest 方法中调用了ProcessRequestInit方法,这里面就用到了ControllerBuilder.GetControllerFactory();
至此IIS的request就进入Mvc 的处理流程,接下来的Service Location工作,请看我的另外一篇文章
DependencyResolver与Service Location:http://www.zzzyk.com/kf/201112/113066.html
谢谢。
摘自 十一月的雨
补充:Web开发 , ASP.Net ,