了解 ASP.NET MVC 的执行流程

Microsoft

了解 ASP.NET MVC 框架如何分步处理浏览器请求。

对基于 MVC 的 ASP.NET Web 应用程序的请求首先通过 UrlRoutingModule 对象(即 HTTP 模块)。 此模块将分析请求并执行路由选择。 UrlRoutingModule 对象选择与当前请求匹配的第一个路由对象。 (路由对象是实现 RouteBase 的类,通常是 Route 类的实例。) 如果没有路由匹配, 则 UrlRoutingModule 对象不执行任何操作,并允许请求回退到常规 ASP.NET 或 IIS 请求处理。

从所选 Route 对象中,UrlRoutingModule 对象获取与 Route 对象关联的 IRouteHandler 对象。 通常,在 MVC 应用程序中,这是 MvcRouteHandler 的实例。 IRouteHandler 实例创建一个 IHttpHandler 对象,并传递 IHttpContext 对象。 默认情况下, MVC 的 IHttpHandler 实例是 MvcHandler 对象。 然后 ,MvcHandler 对象选择最终处理请求的控制器。

注意

如果 ASP.NET MVC Web 应用程序运行在 IIS 7.0 中,则 MVC 项目不需要文件扩展名。 但是,在 IIS 6.0 中,处理程序要求将 .mvc 文件扩展名映射到 ASP.NET ISAPI DLL。

模块和处理程序是 ASP.NET MVC 框架的入口点。 它们执行下列操作:

  • 选择 MVC Web 应用程序中合适的控制器。
  • 获取特定的控制器实例。
  • 调用控制器的 Execute 方法。

下面列出了 MVC Web 项目的执行阶段:

  • 接收对应用程序的第一个请求

    • 在 Global.asax 文件中, Route 对象将添加到 RouteTable 对象。
  • 执行路由

    • UrlRoutingModule 模块使用 RouteTable 集合中第一个匹配的 Route 对象来创建 RouteData 对象,然后使用该对象创建 RequestContext (IHttpContext) 对象。
  • 创建 MVC 请求处理程序

    • MvcRouteHandler 对象创建 MvcHandler 类的实例,并将它传递给 RequestContext 实例。
  • 创建控制器

    • MvcHandler 对象使用 RequestContext 实例标识 IControllerFactory 对象, (通常是用于创建控制器实例的 DefaultControllerFactory 类的实例) 。
  • 执行控制器 - MvcHandler 实例调用控制器的 Execute 方法。 |

  • 调用操作

    • 大多数控制器继承自 Controller 基类。 对于执行此操作的控制器,与 控制器关联的 ControllerActionInvoker 对象确定要调用控制器类的哪个操作方法,然后调用该方法。
  • 执行结果

    • 典型的操作方法可能会接收用户输入,准备相应的响应数据,然后通过返回结果类型来执行结果。 可以执行的内置结果类型包括: ViewResult (呈现视图,是最常用的结果类型) 、 RedirectToRouteResultRedirectResultContentResultJsonResultEmptyResult