ASP.NET MVC教程(3):ASP.NET MVC请求处理顺序 (zh-CN)
在学习 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 Routing。UrlRoutingModule 和 MvcRouteHandler 类是 ASP.NET MVC 框架的入口点。它们执行下列操作:
- 选择 ASP.NET MVC 程序中合适的控制器 Controller。
- 获取特定的控制器Controller实例。
- 调用该控制器的 Execute 方法,执行Action操作方法。 http://54peixun.com/image.axd?picture=634570630955117187MVC%20Process.gif
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(呈现视图并且是最常用的结果类型)、RedirectToRouteResult、RedirectResult、ContentResult、JsonResult、FileResult 和 EmptyResult。 |
4.总结
- ASP.NET MVC 和ASP.NET Web Form请求处理有很大的相似之处。我们可以看出来,整个MVC的架构,前期的基础架构基本都是一样的,所不同的就是在Module 模块和Handler 处理程序的变换。而这不分的变换,主要是为了实现ASP.NET MVC里 请求路由机制,把 MVC三个部分关联起来。
- UrlRoutingModule 和 MvcRouteHandler 就是之前的 Module 模块和Handler 处理程序。
- 换个新的名字,但是在整个架构中的角色没有变化,1个是截获请求,进行分析,转发,一个是进行实际的处理工作。
原文地址: http://msdn.microsoft.com/zh-cn/library/dd381612(v=VS.98).aspx
老徐Frank Xu Lei 修订、翻译、整理
转自:http://54peixun.com/frankxulei/POST/e3100c5816fa4c7c9534229d261c67f1