声明:
- 毕竟不是MS专业翻译,翻得不好不要打我
- 我翻译它的潜在目的在过程中学习,有加入自己的理解,一些正确但是太绕口的话我就略掉了
原文地址在:
http://quickstarts.asp.net/3-5-extensions/mvc/MvcUnderstandingAppExecution.aspx
MVC应用程序的执行过程
概要
当用户发出请求时,请求首先由UrlRoutingModule 对象处理,这个对象是一个HTTP模块(HTTP module)。这个对象在分析请求后,查找第一个与当前请求匹配的route对象(route object). route对象是实现了RouteBase的类,通常都是Route类的实例。
如果没找到任何吻合的route对象,UrlRoutingModule 就不再处理,而由ASP.NET的标准流程或IIS继续处理.
如果找到了一个Route对象,UrlRoutingModule会从Route对象中获取IRouteHandler对象实例。IRouteHandler 对象通常都是MvcRouteHandler的实例,它会创建IHttpHandler对象(默认情形下就是MvcHandler的实例),并传递给IHttpContext 对象。由MvcHandler的实例选择控制器,并最终让这个控制器处理请求。
注意:对于IIS6,要把.mvc文件扩展名映射到ASP.NET ISAPI DLL,IIS7则不用配置。
模块(module)和处理器(handler)是MVC框架的入口点,他们负责以下工作:
- 从MVC Web应用程序这挑选恰当的控制器
- 获取特定的控制器对象实例
- 调用控制器的Execute方法
各执行阶段的具体情况如下表所示:
阶段:首次接收到对应用程序的请求
在Global.asax文件中,Route对象被加入到RouteTable集合。
阶段:route操作
UrlRoutingModule从RouteTable中查找首个匹配的Route对象,创建RouteData对象,用RouteData对象创建RequestContext对象。
阶段: 创建MVC请求处理器
MvcRouteHandler对象实例创建MvcHandler类的实例,然后向它传递RequestContext实例。
阶段:创建控制器
MvcHandler 通过RequestContext实例找到IControllerFactory 对象,用它来创建控制器对象实例。IControllerFactory 对象通常都是DefaultControllerFactiory的实例。
如果没有找到对应的控制器,将返回HTTP500错误。
阶段:执行控制器
MvcHandler调用控制器的Execute方法。
阶段:调用动作方法
多数控制器类都是从Controller 基类继承来的,凡是这类控制器,其内部的ControllerActionInvoker对象负责判断应该调用哪个动作方法,并由它来调用。