首页 / 网页编程 / ASP.NET / 深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler
深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler2011-03-26 博客园 Terry SunMvcHandler是一个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 HeaderAddVersionHeader(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
});
}