.NET MVC 生命周期

.net mvc应用程序请求和响应过程中,主要包含8个步骤:

  1)RouteTable(路由表)的创建
      2)UrlRoutingModule 请求拦截
      3)Routing engine 确定route
      4)route handler 创建相关的IHttpHandler实例
      5)IHttpHandler实例确定Controller(控制器)
      6)Controller执行
      7)一个视图引擎创建
      8) 视图呈现

主要流程图如下:

.NET MVC 生命周期


1)RouteTable的创建
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方法调用的数据。