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
});
}