您的位置:首页 > 编程语言 > ASP

ASP.NETMVC 请求生命周期

2013-07-14 10:59 411 查看
ASP.NETMVC
请求生命周期


      当一个asp.netmvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤!在asp.netmvc应用程序Httprequest
和Httpresponse
过程中,主要包含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
定义在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的routingengine(路由引擎)。HttpContext实例包含当前请求的所有数据。UrlRoutingModule控制着routingengine,提供了HttpContext数据到routingengine!
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实例

 在routetable里,每一个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方法调用的数据!
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: