在学习 ASP.NET MVC编程的过程中,很重要的一点,就是我们想知道 例子客户端浏览器的请求,最终是怎么样在网站中处理的。大家肯定有很多疑惑,到期ASP.NET MVC是不是处理请求完全推到了之前的基础架构,重新进行的设计,还是和ASP.NET Web Form进行了兼容扩展呢?
现在我们先来看看 ASP.NET Web Form处理过程

1. ASP.NET Web Form请求处理过程

我们知道 ASP.NET Web Form编程用,IIS6请求的处理的过程如下:

IIS6 的 ASP.net 请求处理过程

ASP.NET的请求过程是基于一个管道(pipeline)模型的,ASP.NET会把所有的http请求(Requests)都发送给这个管道里的http组件(modules)。每个组件在接收到http请求后进行一些相应处理工作。当http请求通过了所有的http modules程序后,将会被交由一个http handler程序来处理,处理后的结果又将通过管道里http modules返回。

2 ASP.NET MVC 请求过程图:

ASP.NET MVC 的 Web 请求首先通过 UrlRoutingModule 对象(HTTP Module 模块)进行传递。此模块将分析请求并执行路由选择(这和ASP.NET Web Form里类似,只是路由器就是 一个Model模块,他们来分发请求 给特定的Handler处理程序)。UrlRoutingModule 对象将选择与当前请求匹配的第一个路由对象。路由对象是实现 RouteBase 的类,并且通常是 Route 类的实例。) 如果任何路由都不匹配,则 UrlRoutingModule 对象不执行任何操作,并允许请求回退到常规的 ASP.NET Web Form 或 IIS 请求处理流程。这个就和第一节相同了。

从选定的 Route 对象中,UrlRoutingModule 对象将获得一个对象,所获得的对象将实现 IRouteHandler接口并与 Route 对象关联。通常,在 MVC 应用程序中,这将是 MvcRouteHandler 类的一个实例。MvcRouteHandler 实例将创建一个实现 IHttpHandler 接口的 MvcHandler 对象。
然后,MvcHandle 对象会选择将最终处理该请求的控制器Controller。有关更多信息,请参见 ASP.NET RoutingUrlRoutingModule 和 MvcRouteHandler 类是 ASP.NET MVC 框架的入口点。它们执行下列操作:
  • 选择 ASP.NET MVC 程序中合适的控制器 Controller。
  • 获取特定的控制器Controller实例。
  • 调用该控制器的 Execute 方法,执行Action操作方法。

3 ASP.NET MVC 项目的执行阶段

下表列出了 ASP.NET MVC Web 程序的执行阶段。
阶段
详细信息
接收请求
在 Global.asax 文件中,Route 对象将添加到 RouteTable 对象中。
执行路由
UrlRoutingModule 模块使用 RouteTable 中第一个匹配的 Route 对象来创建 RouteData 对象,然后创建 RequestContext 对象。
创建Handler
MvcRouteHandler 创建 MvcHandler 类的实例,并将 RequestContext 实例传递给处理程序。
创建控制器
MvcHandler 对象使用 RequestContext 实例标识用于创建控制器实例的 IControllerFactory 对象
执行控制器
MvcHandler 实例调用控制器的 Execute 方法。
调用操作
对于从 ControllerBase 类继承的控制器,与该控制器关联的 ControllerActionInvoker 对象将决定要调用的 controller 类的操作方法
执行结果
返回结果类型来执行结果。可执行的内置结果类型包括:ViewResult(呈现视图并且是最常用的结果类型)、RedirectToRouteResultRedirectResultContentResultJsonResultFileResultEmptyResult

4.总结

  1. ASP.NET MVC 和ASP.NET Web Form请求处理有很大的相似之处。我们可以看出来,整个MVC的架构,前期的基础架构基本都是一样的,所不同的就是在Module 模块和Handler 处理程序的变换。而这不分的变换,主要是为了实现ASP.NET MVC里 请求路由机制,把 MVC三个部分关联起来。
  2. UrlRoutingModule 和 MvcRouteHandler 就是之前的 Module 模块和Handler 处理程序。
  3. 换个新的名字,但是在整个架构中的角色没有变化,1个是截获请求,进行分析,转发,一个是进行实际的处理工作。
老徐Frank Xu Lei 修订、翻译、整理

转自:http://54peixun.com/frankxulei/POST/e3100c5816fa4c7c9534229d261c67f1