黑马程序员技术交流社区

标题: [转帖]详解ASP.NET MVC应用程序请求生命周期 [打印本页]

作者: 黑马-金鑫    时间: 2012-9-10 10:13
标题: [转帖]详解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的在应用程序的具体使用如下

public class MvcApplication : System.Web.HttpApplication    {    public static void RegisterRoutes(RouteCollection routes)    {    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");     routes.MapRoute(    "Default",  // Route name    "{controller}/{action}/{id}",   // URL with parameters    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults    );    routes.MapRoute(   "Account",  // Route name   "{controller}/{action}/{id}",   // URL with parameters   new { controller = "Account", action = "LogOn", id = "" }  // Parameter defaults   );       }     protected void Application_Start()    {    RegisterRoutes(RouteTable.Routes);    }    } 2)UrlRoutingModule 请求拦截

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



UrlRoutingModule 具体的数据结构如下:

public class UrlRoutingModule : IHttpModule    {     // 主要的 Methods     protected virtual void Init(HttpApplication application);     private void OnApplicationPostMapRequestHandler(object sender, EventArgs e);     private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);     public virtual void PostMapRequestHandler(HttpContextBase context);     public virtual void PostResolveRequestCache(HttpContextBase context);     void IHttpModule.Init(HttpApplication application);      // Properties     public RouteCollection RouteCollection { get; set; }      }  UrlRoutingModule 在WebConfig的注册     <httpModules> <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0,  Culture=neutral,PublicKeyToken=31BF3856AD364E35"/>    </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所创建!



具体的细节如下

public interface IRouteHandler  {  // Methods  IHttpHandler GetHttpHandler(RequestContext requestContext);  }  
5)IHttpHandler实例确定Controller(控制器)

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



MvcHandler主要有一个ControllerBuilder  _controllerBuilder字段;

具体细节如下

public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState  {  // 主要的Fields  private ControllerBuilder _controllerBuilder;  }  ControllerBuilder类主要有一个方法GetControllerFactory  public class ControllerBuilder  {    public IControllerFactory GetControllerFactory();  } 通过实现IControllerFactory 工厂 创建一个Controller

北京做网站

6)Controller执行

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



7)一个视图引擎创建

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



8) 视图呈现

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


作者: 许庭洲    时间: 2012-9-10 10:19
太有才了,值得学习ing!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2