Asp.net MVC源码分析--UrlRoutingModule与Service location的亲

来源:未知 责任编辑:智问网络 发表时间:2013-10-07 01:00 点击:

 

这篇文章我们主要探讨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.2cto.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.2cto.com/kf/201112/113066.html

谢谢。

 

摘自 十一月的雨

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • C#高级编程:数据库连接[1]
    • asp.net 设置GridView的选中行的实现代码
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET GridView列表代码示例
    • 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transforma
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1