熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

詳解ASP.NET MVC應用程序請求生命周期

2013-11-13 10:01:45  來源: .NET編程 

  當一個ASPNET MVC應用程序提出請求為了響應請求包含一些請求執行流程步驟! 在ASPNET MVC應用程序Http request

  和Http response 過程中主要包含個步驟:

  )RouteTable(路由表)的創建

  )UrlRoutingModule 請求攔截

  )Routing engine 確定route

  )route handler 創建相關的IHttpHandler實例

  )IHttpHandler實例確定Controller(控制器)

  )Controller執行

  )一個視圖引擎創建

  ) 視圖呈現

  主要流程圖如下:  

  )RouteTable的創建

  RouteTable的創建發生在mvc應用程序的啟動 或者web應用程序池的重啟!通常的程序
      一個頁面請求對應磁盤上的一個頁面!如(x

  對應到服務器磁盤上的文件indexaspx)indexaspx實際上是一個類由IHttpHandler創建實例化

  IHttpHandler包含一個

  ProcessRequest方法負責響應頁面輸出!

  但是mvc application 是不同的每一個請求映射到routeroute 定義在route table在應用程序啟動時創建!

  RouteTable的在應用程序的具體使用如下
      public class MvcApplication :
        SystemWebHttpApplication
       { 
                 public static void RegisterRoutes(RouteCollection routes) 
       {  
        routesIgnoreRoute({resource}axd/{*pathInfo}); 
        routesMapRoute(    Default  // Route name    {controller}/{action}/{id}
        // URL with parameters    new { controller = Home action = Index id =
       // Parameter defaults    );  
        routesMapRoute(   Account  // Route name   {controller}/{action}/{id}  
      // URL with parameters   new { controller = Account action = LogOn id = }
     // Parameter defaults   );    
       }   
        protected void Application_Start() 
       {   
            RegisterRoutes(RouteTableRoutes);  
        }   
        }
           )UrlRoutingModule 請求攔截

  每一個Http 請求 都被UrlRoutingModule攔截UrlRoutingModule提供了當前的HttpContext的 

  routingengine(路由引擎)
                HttpContext實例包含當前請求的所有數據UrlRoutingModule控制著routing engine

  提供了HttpContext數據到routing engine! UrlRoutingModule實現了IHttpModule接口在nfig 文件進行

  了注冊!

  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 IHttpModuleInit(HttpApplication application);   
                   // Properties     public RouteCollection RouteCollection { get; set; } 
               } 
               UrlRoutingModule 在WebConfig的注冊   
              <httpModules> <add name=UrlRoutingModule type=SystemWebRoutingUrlRoutingModule   

  SystemWebRouting Version=  Culture=neutralPublicKeyToken=BFADE/>  
          </httpModules>

  )Routing engine 確定route

  routing engine基於當前HttpContext確定Route的處理routing engine 指出route table裡面匹配的route

  在 IRouteHandler實例創建route處理!

  )route handler 創建相關的IHttpHandler實例在route table裡每一個route 都與一個IHttpHandler對應
         IHttpHandler基於當前的HttpContext數據負責創建一個Controller(控制器)!IHttpHandler是由當前活動的

  IRouteHandler的GetHttpHandler所創建!

  具體的細節如下

  public interface IRouteHandler 

  {

  // Methods  IHttpHandler GetHttpHandler(RequestContext    requestContext);

  }

  )IHttpHandler實例確定Controller(控制器)

  在MVC應用程序中MvcHandler實現了IHttpHandlerController實例是基於所輸入的HttpContext 

  和Url參數 與route 對應的
          ControllerFactory 創建一個controllerControllerContext包含上下文數據傳入到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

  )Controller執行

  所有的controller 邏輯調用執行時actions請求被執行!當controller的邏輯被執行時會返回一個

  ActionResult
               一個ActionResult實例會觸發呈現一個View(視圖)當觸發發生時一個視圖引擎被創建進行進一

  步的處   理

  )一個視圖引擎創建

  視圖引擎實例會創建一個IView接口實例返回一個ViewEngineResult實例

  ) 視圖呈現

  IView實例編譯請求視圖提供Render方法調用的數據!


From:http://tw.wingwit.com/Article/program/net/201311/12318.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.