zoukankan      html  css  js  c++  java
  • ASP.NETMVC 请求生命周期

    ASP.NETMVC 请求生命周期

          当一个asp.netmvc应用程序提出请求,为了响应请求,包含一些请求执行流程步骤!asp.netmvc应用程序Httprequest
    Httpresponse 过程中,主要包含8个步骤:
       
      1RouteTable(路由表)的创建
         2UrlRoutingModule 请求拦截
         3Routing engine 确定route
         4route handler 创建相关的IHttpHandler实例
         5IHttpHandler实例确定Controller(控制器)
         6Controller执行
         7)一个视图引擎创建
         8) 视图呈现
    主要流程图如下:

                   

    1RouteTable的创建
           RouteTable
    的创建发生在mvc应用程序的启动或者web应用程序池的重启!通常的asp.net程序,一个页面请求对应磁盘上的一个页面!如(http://localhost/index.aspx
     
    对应到服务器磁盘上的文件index.aspxindex.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);
            }
        }

     

     

    2UrlRoutingModule 请求拦截
     
    每一个Http 请求都被UrlRoutingModule拦截,UrlRoutingModule提供了当前的HttpContextroutingengine(路由引擎)。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 { getset; }

        }
         UrlRoutingModule 
    WebConfig的注册
        <httpModules>
        <add name=
    "UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0,                  Culture=neutral,    PublicKeyToken=31BF3856AD364E35"/>
            </httpModules>

     

     

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

     

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

    具体的细节如下

     

    public interface IRouteHandler
    {
        
    // Methods
        IHttpHandler GetHttpHandler(RequestContext requestContext);
    }

     

     

     

     

    5IHttpHandler实例确定Controller(控制器)
     
    MVC应用程序中,MvcHandler实现了IHttpHandlerController实例,是基于所输入的HttpContextUrl参数与route 对应的,ControllerFactory创建一个controllerControllerContext包含上下文数据,传入到controllerExcute方法,触发controller的逻辑处理!

    MvcHandler主要有一个ControllerBuilder _controllerBuilder字段;

    具体细节如下

      

    public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState
    {
        
    // 主要的Fields
        private ControllerBuilder _controllerBuilder;
    }
    ControllerBuilder
    类主要有一个方法GetControllerFactory
    public class ControllerBuilder
    {
      
    public IControllerFactory GetControllerFactory();
    }

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

     

     

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

     

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

     

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

  • 相关阅读:
    Codeforces 1354C2
    Codeforces 1354C1
    Codeforces 1355C
    Codeforces 1353D
    Codeforces 1352
    Codeforces 1351C
    Codeforces 1344B/1345D
    Codeforces 1342D
    Codeforces 1340B/1341D
    Codeforces 1343D
  • 原文地址:https://www.cnblogs.com/ful1021/p/4804515.html
Copyright © 2011-2022 走看看