当前位置:编程学习 > asp >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,