首页 > 技术文章 > Asp.net MVC 之请求生命周期

ck168 2016-05-26 13:58 原文

今天主要试着描述一下ASP.NET MVC 请求从开始到结束的整个生命周期,了解这些后,对MVC会有一个整体的认识。

这里主要研究了MVC请求的五个过程。

1、创建RouteTable

  当ASP.NET应用程序第一次启动的时候才会发生第一步。RouteTable把URL映射到Handler。

2、UrlRoutingModule拦截请求

  第二步在我们发起请求的时候发生。UrlRoutingModule拦截了每一个请求并且创建和执行合适的Handler。

3、生成控制器

  MvcHandler创建了控制器,并且把控制器传入ControllerContext,然后执行控制器。

4、执行行为

  控制器检测要执行的控制器方法,构建参数列表并且执行方法。

5、呈现视图

  大多数情况下,控制器方法调用RenderView()来把内容呈现回浏览器。Controller.RenderView()方法把这个工作委托给某个ViewEngine来做。

 

下面详细的说明每一个过程的情况

一、创建RouteTable

  (1)当我们创建ASP.NET MVC应用程序的时候,创建的是一批控制器。使用控制器的优势是可以在URL和页面之间可以有多对一的映射。

  (2)某个页面请求是怎么路由到某个控制器上的呢?ASP.NET MVC应用程序有一个叫做路由表(Route Table)的东西。路由表映射某个URL到某个控制器上。

  (3)一个应用程序有一个并且只会有一个路由表。

  (4)应用程序的路由表由RouteTable.Routes的静态属性表示。这个属性表示了路由对象的集合。在清单1列出的Global.asax文件中,我们在应用程序首次启动时为路由表增加两个路由对象(Application_Start()方法在第一次请求网站页面的时候被调用一次)。

  (5)路由对象负责把URL映射到Handler。

二、UrlRoutingModule拦截请求

  (1)拦截后第一件事情是包装当前的HttpContext为HttpContextWrapper2对象。

  (2)Module把包装后的HttpContext传给在之前步骤中创建的RouteTable。(HttpContext包含了URL、表单参数、查询字符串参数以及和当前请求关联的cookie。如果在当前请求和路由表中的路由对象之间能找到匹配,就会返回路由对象。)

  (3)UrlRoutingModule成功获取了RouteData对象,Module然后就会创建表示当前HttpContext和RouteData的RouteContext对象。Module然后实例化基于RouteTable的新HttpHandler,并且把RouteContext传给Handler的构造函数。

  (4)只要UrlRoutingModule匹配当前请求到路由表中的路由,就会实例化带有当前RouteContext的MvcHandler。

  (5)Module进行的最后一步就是把MvcHandler设置为当前的HTPP Handler。ASP.NET应用程序自动调用当前HTTP Handler的ProcessRequest()方法然后转入下一步。

三、生成控制器执行MvcHandler

  (1)当之前内容中创建的MvcHandler对象的ProcessRequest()被调用的时候,会创建一个新的控制器。

  (2)RequestContext以及控制器的名字被传入ControllerFactory.CreateController()方法来获得一个控制器。然后,从RequestContext和控制器构造ControllerContext对象。最后,调用控制器类的Execute()方法。在调用Execute()方法的时候会给方法传入ControllerContext。

四、执行控制器行为

  (1)Execute()方法首先创建TempData对象(在Ruby On Rails中叫做Flash对象)。TempData可以用于保存下次请求必须的临时数据(TempData和会话状态差不多,不长期占用内存)。

  (2)接着,Execute()方法构建请求的参数列表。这些参数从请求参数中提取,将会被作为方法的参数。参数会被传入执行的控制器方法。

  (3)Execute()通过对控制器类进行反射来找到控制器的方法。控制器类是我们写的。Execute()方法找到了我们控制器类中的方法后就执行它。Execute()方法不会执行被装饰NonAction特性的方法。

  至此,就进入了自己应用程序的代码。

五、调用RenderView 方法

  通常,我们的控制器方法最后会调用RenderView()或RedirectToAction()方法。RenderView()方法负责把视图(页面)呈现给浏览器。

 

以上大致就是ASP.NET MVC 整个的生命周期。

推荐阅读