详解ASP.NET MVC应用程序请求生命周期

开发 后端
本文将介绍的是ASP.NET MVC应用程序的请求生命周期,包括相应的流程图及步骤,希望能对大家有所帮助。

当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request

和Http response 过程中,主要包含8个步骤:

 

1)RouteTable(路由表)的创建

 

2)UrlRoutingModule 请求拦截

 

3)Routing engine 确定route

 

4)route handler 创建相关的IHttpHandler实例

 

5)IHttpHandler实例确定Controller(控制器)

 

6)Controller执行

 

7)一个视图引擎创建

 

8) 视图呈现

 

主要流程图如下:

 

   主要流程图

1)RouteTable的创建

RouteTable的创建发生在mvc应用程序的启动 或者web应用程序池的重启!通常的asp.net程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx

 

 对应到服务器磁盘上的文件index.aspx)index.aspx实际上是一个类,由IHttpHandler创建实例化。IHttpHandler包含一个

 

 ProcessRequest方法,负责响应页面输出!

 

但是mvc application 是不同的,每一个请求映射到route,route 定义在route table,在应用程序启动时创建!

RouteTable的在应用程序的具体使用如下

  1. public class MvcApplication : System.Web.HttpApplication  
  2.   {  
  3.   public static void RegisterRoutes(RouteCollection routes)  
  4.   {  
  5.   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  6.  
  7.   routes.MapRoute(  
  8.   "Default",  // Route name  
  9.   "{controller}/{action}/{id}",   // URL with parameters  
  10.   new { controller = "Home"action = "Index"id = "" }  // Parameter defaults  
  11.   );  
  12.   routes.MapRoute(  
  13.  "Account",  // Route name  
  14.  "{controller}/{action}/{id}",   // URL with parameters  
  15.  new { controller = "Account"action = "LogOn"id = "" }  // Parameter defaults  
  16.  );  
  17.    
  18.   }  
  19.  
  20.   protected void Application_Start()  
  21.   {  
  22.   RegisterRoutes(RouteTable.Routes);  
  23.   }  
  24.   } 

2)UrlRoutingModule 请求拦截

每一个Http 请求 都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContext的routing engine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routing engine,提供了HttpContext数据到routing engine! UrlRoutingModule实现了IHttpModule接口,在web.config 文件进行了注册!

 

UrlRoutingModule 具体的数据结构如下:

  1. public class UrlRoutingModule : IHttpModule  
  2.   {  
  3.    // 主要的 Methods  
  4.    protected virtual void Init(HttpApplication application);  
  5.    private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);  
  6.    private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);  
  7.    public virtual void PostMapRequestHandler(HttpContextBase context);  
  8.    public virtual void PostResolveRequestCache(HttpContextBase context);  
  9.    void IHttpModule.Init(HttpApplication application);  
  10.  
  11.    // Properties  
  12.    public RouteCollection RouteCollection { get; set; }  
  13.  
  14.    }  
  15. UrlRoutingModule 在WebConfig的注册  
  16.    <httpModules> 
  17. <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, 
  18. System.Web.Routing, Version=3.5.0.0, 
  19.  Culture=neutral,PublicKeyToken=31BF3856AD364E35"/> 
  20.    </httpModules> 
 
 

3)Routing engine 确定route

routing engine基于当前HttpContext确定Route的处理。routing engine 指出route table里面匹配的route ,并在IRouteHandler实例创建route处理!

 

4)route handler 创建相关的IHttpHandler实例在route table里,每一个route 都与一个IHttpHandler对应。IHttpHandler基于当前的HttpContext数据负责创建一个Controller(控制器)!IHttpHandler是由当前活动的IRouteHandler的GetHttpHandler所创建!

 

具体的细节如下

  1. public interface IRouteHandler  
  2. {  
  3. // Methods  
  4. IHttpHandler GetHttpHandler(RequestContext requestContext);  
 

5)IHttpHandler实例确定Controller(控制器)

 在MVC应用程序中,MvcHandler实现了IHttpHandler,Controller实例,是基于所输入的HttpContext 和Url参数与route 对应的,ControllerFactory 创建一个controller,ControllerContext包含上下文数据,传入到controller的Excute方法,触发controller的逻辑处理!

 

MvcHandler主要有一个ControllerBuilder  _controllerBuilder字段;

具体细节如下

  1.  public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState  
  2. {  
  3. // 主要的Fields  
  4. private ControllerBuilder _controllerBuilder;  
  5. }  
  6. ControllerBuilder类主要有一个方法GetControllerFactory  
  7. public class ControllerBuilder  
  8. {  
  9.   public IControllerFactory GetControllerFactory();  

通过实现IControllerFactory 工厂 创建一个Controller

 

6)Controller执行

 所有的controller 逻辑调用执行时,actions请求被执行!当controller的逻辑被执行时,会返回一个ActionResult。一个ActionResult实例,会触发呈现一个View(视图),当触发发生时,一个视图引擎被创建,进行进一步的处理

 

7)一个视图引擎创建

 视图引擎实例会创建一个IView接口实例,返回一个ViewEngineResult实例,

 

8) 视图呈现

 IView实例编译请求视图,提供Render方法调用的数据!

原文标题:MVC 请求生命周期

链接:http://www.cnblogs.com/skyyang/archive/2010/04/02/1702769.html

【编辑推荐】

 

  1. 详解ASP.NET MVC 2中的Area特性
  2. 专访微软MVP衣明志:走进ASP.NET MVC 2框架开发
  3. 详解ASP.NET MVC 2中强类型HTML辅助方法
  4. 详解ASP.NET MVC 2自定义验证
  5. Scott Gu教你使用ASP.NET MVC 2新功能
责任编辑:彭凡 来源: 博客园
相关推荐

2009-02-12 13:16:55

请求生命周期MVCASP.NET

2009-07-20 10:33:02

ASP.NET MVC

2009-07-23 18:14:17

MVC生命周期

2012-08-16 09:38:38

ASP.NET

2009-07-31 10:47:18

ASP.NET页面生命

2009-08-10 14:31:46

ASP.NET组件设计ASP.NET控件生命

2011-08-10 16:50:10

iPhone生命周期

2009-07-23 10:23:44

2013-04-07 10:42:56

Asp.Net页面周期

2009-07-23 13:26:21

2009-08-04 16:05:15

ASP.NET页面生命

2009-08-04 16:50:15

ASP.NET页面生命

2009-07-24 11:25:53

Web应用程序工程ASP.NET MVC

2009-07-22 18:07:55

论坛应用程序ASP.NET MVC

2009-07-22 18:02:27

论坛应用程序ASP.NET MVC

2013-07-31 14:50:32

Windows PhoWP应用程序生命周期

2015-07-09 15:42:48

ios应用生命周期

2011-07-20 15:58:58

iPhone 应用程序 生命周期

2009-06-24 10:34:39

JSF生命周期JSF应用程序

2009-08-14 17:57:43

ASP.NET MVC
点赞
收藏

51CTO技术栈公众号