程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler

深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler

編輯:關於ASP.NET

MvcHandler是一個mvc程序真正開始的地方,因為你可以直接看到並調試它的源碼。

MvcHandler的主要代碼如下:

protected internal virtual void ProcessRequest(HttpContextBase  httpContext) {
       AddVersionHeader(httpContext);

       // Get the controller type
       string controllerName =  RequestContext.RouteData.GetRequiredString("controller");

       // Instantiate the controller and call Execute
       IControllerFactory factory =  ControllerBuilder.GetControllerFactory();
       IController controller = factory.CreateController (RequestContext, controllerName);
       if (controller == null) {
         throw new InvalidOperationException(
           String.Format(
             CultureInfo.CurrentUICulture,
             MvcResources.ControllerBuilder_FactoryReturnedNull,
             factory.GetType(),
             controllerName));
       }
       try {
         controller.Execute(RequestContext);
       }
       finally {
         factory.ReleaseController(controller);
       }
     }

這個方法的流程可以概括為: 找到Requst中的Controller name, 根據Controller name創建這個Controller, 執行這個Controller中執行被請求的Action。

具體分析如下:

1. 添加Http Header

AddVersionHeader(httpContext);

添加一個Http Header: HTTP/1.1 200 OK   …   X-AspNetMvc-Version: 1.0…

2. 從路由表中找到請求的controller的名子

string controllerName =  RequestContext.RouteData.GetRequiredString("controller");

獲取路由表中的controller name, 在下面的代碼中根據這個controller name在緩存 中查找到對應的controller類型並生成controller類。

3. 返回一個IControllerFactory對象

IControllerFactory factory =  ControllerBuilder.GetControllerFactory();

返回一個繼承自IControllerFactory接口的類的實例,這裡默認返回 DefaultControllerFactory類。 ControllerBuilder屬性是ControllerBuilder類的一個 靜態實例,在mvc程序第一次啟動時才會執行 ControllerBuilder類的默認構造函數,在 這個構造函數將DefaultControllerFactory類的一個實例傳入到SetControllerFactory() 方法中,這樣做的目地是定義GetControllerFactory()的具體返回類型。 ControllerBuilder類的構造函數代碼如下:

public ControllerBuilder() {
       SetControllerFactory(new DefaultControllerFactory() {
         ControllerBuilder = this
       });
     }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved