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

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

时间: 2024-08-01 12:57:19

深入分析ASP.NET Mvc 1.0 – 1. 深入MvcHandler的相关文章

深入分析ASP.NET Mvc 1.0 – 3

深入分析ASP.NET Mvc 1.0 – 3. Controller.Execute(Request)-ActionInvoker.InvokeAction() 上次讲到Controller中的ExecuteCore方法分为三个部执行: TempData.Load(ControllerContext, TempDataProvider) ActionInvoker.InvokeAction(ControllerContext, actionName) TempData.Save(Control

深入分析ASP.NET Mvc 1.0 – 2

深入分析ASP.NET Mvc 1.0 – 2. Controller.Execute(Request)-TempDataDictionary的Load与Save操作 Controller最终是通过调用ControllerBase类的Execute(RequestContext)方法来完成 一个Action的创建与执行操作,代码如下: protected virtual void Execute(RequestContext requestContext) { if (requestContex

深入分析ASP.NET Mvc 1.0 – 4. 使用ModelBinder绑定Action的参数

在前一篇文章已经讲叙Controller.Execute(-)方法的执行流程中会调用 ControllerActionInvoker类的 InvokeAction(ControllerContext controllerContext, string actionName)方法,在InvokeAction(-)方法内又调用了GetParameterValues(-) 方法,这个方法为Action中的每个参数赋值,追踪到 GetParameterValues(-)方法内部 会发现其实每个参数的值是

ASP.NET MVC 1.0浅析

为什么要用ASP.NET MVC 1.0?当我刚知道1.0发布的时候,经常这样问. 最近正在考虑是否在我们的企业级应用中使用ASP.NET MVC 1.0框架,因此会一直找使用它的理由,希 望大家在关注技术的同时,结合企业应用谈谈自己的看法. 1.MVC的组成 Models:访问数据库,装载数据.处理业务逻辑.在项目中体现为数据实体类加业务代理类. Views:显示数据,用户界面.在项目中体现为aspx页面,偶尔可以加上code-behind. Controller:按路由规则将请求的数据传送给

将ASP.NET MVC 2.0部署在IIS6和IIS7上的教程

我的程序开发环境: 系统:Win7 IIS:IIS7 开发工具:VS2008 SP1 MVC版本:ASP.NET MVC 2.0 RC 在部署MVC应用之前,一定要确保你的程序BIN文件夹下面是否包含 System.Web.Mvc.dll(非常重要),如图: 如果没有, 请在你的MVC项目中,打开引用列表,如图: 鼠标右键点击System.Web.Mvc,选择"属性",转到下面窗口: 将"复制本地"设为True (默认为False),然后生成一下项目,System.

将ASP.NET MVC 2.0 部署在IIS6和IIS7上的教程

原文:http://www.cnblogs.com/taven/archive/2010/01/13/1646244.html   我的程序开发环境: 系统:Win7  IIS:IIS7 开发工具:VS2008 SP1 MVC版本:ASP.NET MVC 2.0 RC   在部署MVC应用之前,一定要确保你的程序BIN文件夹下面是否包含 System.Web.Mvc.dll(非常重要),如图:   如果没有, 请在你的MVC项目中,打开引用列表,如图:    鼠标右键点击System.Web.M

返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作 [索引页][源码下载] 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性

原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 4.0 新特性之移动特性 为不同的客户端提供不同的视图 手动重写 UserAgent,从而强制使用对应的视图 示例1.演示如何为不同的客户端提供不同的视图Global.asax.cs /* * 为

返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 3.0 新特性之 Controller: Global Action Filter 可以在标记为 ChildActionOnly 的 Action 上使用 OutputCa