• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NETMVC应用程序请求的生命周期讨论

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

   当一个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方法调用的数据!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
iis6.0与asp.net的运行原理发布时间:2022-07-10
下一篇:
Asp.net在IE10、IE11下事件丢失经验总结发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap