快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

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

所以想要改变GetControllerFactory()的默认返回类型的办法就是在执行 ControllerBuilder.GetControllerFactory()之前调用ControllerBuilder类中的

SetControllerFactory()方法,这个方法有两个重载

public void SetControllerFactory(IControllerFactory  controllerFactory) {
       if (controllerFactory == null) {
         throw new ArgumentNullException("controllerFactory");
       }

       _factoryThunk = () => controllerFactory;
     }

public void SetControllerFactory(Type controllerFactoryType) {
      

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号