zoukankan      html  css  js  c++  java
  • 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的 

            routingengine(路由引擎)
                    。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方法调用的数据!

  • 相关阅读:
    elasticsearch 启动
    经纬度解析API
    http://t.cn/xxxxx的短链接如何生成?
    IIS+PHP上传文件大小限制和上传时间限制,iis7和iis8上传文件大小限制和上传时间限制
    WIN2003+IIS6环境SSL证书的安装
    如何创建文件名前带点的文件夹,文件夹名字带点
    解决MYSQL的错误:Got a packet bigger than 'max_allowed_packet' bytes
    php 设置临时内存和超时设置脚本最大执行时间
    谷歌地图 API 开发之获取坐标以及街道详情
    隐藏 google 地图 Logo 隐藏 百度 地图 Logo
  • 原文地址:https://www.cnblogs.com/ycdx2001/p/1760646.html
Copyright © 2011-2022 走看看