ASP.NET MVC 生命周期
本文的目标是提供对 MVC 管道的良好理解。生命周期基本上是在特定时间发生的特定阶段的集合。
MVC实际上定义了两个生命周期,应用程序生命周期和请求生命周期。
应用程序生命周期,其中应用程序进程启动正在运行的服务器,直到它停止。它在应用程序的启动文件中标记了这两个事件。即应用程序开始和结束事件
这与请求生命周期是分开的,请求生命周期是应用程序每次处理 HTTP 请求时执行的事件或阶段的顺序。
MVC 请求生命周期:
- 每个 MVC 应用程序的起点都是从路由开始的。之后,接收到的请求会在 URL 路由模块的帮助下找出并找到应该如何处理它。路由模块负责将传入的 URL 与我们在应用程序中定义的路由进行匹配。
- 每个路由都有一个与之关联的路由处理程序。如果请求与我们的 MVC 应用程序中定义的路由匹配,则 MVC 路由处理程序会检索 MVC HttpHandler 的实例。
- MVC 处理程序启动初始化和执行控制器的过程。 MVC 框架处理将路由数据转换为可以处理请求的特定控制器。
- 这是通过像控制器工厂和激活器这样的 MVC 组件来实现的,它们负责创建控制器类的实例。
- 创建控制器后,称为动作调用程序的组件会找到并选择适当的动作方法以在我们的控制器上调用。
- 模型绑定发生在调用方法之前,它将来自我们的 HTTP 请求的数据映射到我们的操作方法的参数。在生成动作结果之前和之后也称为动作过滤器。
- 现在我们的动作结果准备好后,下一个阶段触发,即结果执行。
- 如果结果是视图类型,将调用视图引擎,它会找到视图并渲染它。
- 如果不是视图类型,则操作结果将自行执行。此结果执行只不过是对原始 HTTP 请求生成实际响应。
现在让我们看看代码结束,
MVC 应用程序是每个 MVC 项目的主要部分。该类继承自 HttpApplication 类。此类公开了许多请求生命周期事件,我们可以将事件处理程序附加到这些事件并运行我们自己的代码。
应用程序开始和结束。这两个事件在任何其他事件之前和之后运行,并允许我们的应用程序开始或停止接收请求。
申请开始:
所以每个 MVC 应用程序的生命周期都是从一个应用程序启动事件开始的。当应用程序收到第一个请求时触发此事件。这是 MVC 应用程序的入口点文件。当应用程序收到第一个请求时触发此事件。它允许我们在任何事情发生之前执行全局配置,我们可以在此处查看默认实现。
正如你在这里看到的,
C#
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace MVC_Application {
public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(
GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
- 在 MVC 应用程序中,您可以将其用于各种任务,例如应用全局配置、注册脚本和 CSS 包。正如您在此处看到的默认实现 RegisterBundles、RegisterGlobalFilters 等
- RegisterRoutes 方法将我们定义的任何路由添加到 RouteTable 类的静态集合中。这是 URL 路由尝试与传入 URL 匹配的路由集合。
- 我们需要在任何事情发生之前定义它,以便请求有匹配的东西。并且这些路由中的每一个还需要有一个关联的 RoutHandler 类,该类将在与路由匹配后实际处理传入的请求。 RouteHandler 用于检索请求的正确 Httphandler。
申请结束:
当我们的应用程序停止并且无法接收更多请求时会触发此事件。很少使用此事件,但如果您想在应用程序完全关闭之前运行任何任务。这是一个很好的地方。
预申请开始:
在某些情况下,您希望在应用程序启动之前执行一些自定义代码。在这种情况下,我们可以选择使用 PreApplication Start 方法。实际上,此方法是在装配级别定义的。
让我们详细了解每个阶段:
控制器初始化:
MVCHandler 的,
- ProcessRequest方法负责生成对传入请求的响应。为此,它必须创建并执行一个控制器。
- 首先,它调用一个名为ProcessRequestInit的子方法,该方法要求一个名为 Controller Factory 的组件为当前请求提供一个 Controller。控制器工厂使用传递的路由数据从当前应用程序中选择适当的控制器类。
- 接下来,工厂使用一个名为 Controller Activator 的组件来实际创建该类的实例。 Controller Activator 在实例化请求的类时使用依赖解析器。它允许实现依赖注入之类的模式在 MVCHandler 从这些步骤中获取一个 Controller 之后,它会调用该 Controller 上的 Execute 方法。正是在此方法中,所有强大的工具(如 Action 方法)都被公开并开始处理。
动作方法执行过程:
下一阶段,
- Action Invoker 负责选择和执行处理传入请求的最佳方法。它通过将路由数据与方法名称以及应用于该方法的操作选择器进行匹配来选择。
- 一旦之前选择了该方法,它就会执行身份验证和授权过程。这些安全步骤是通过 MVC 过滤器实现的。它是允许您将逻辑注入处理管道的组件,因此
- 第一个身份验证,此过滤器验证该人是否是他们所说的身份,如果身份验证失败,则如果身份验证成功,则将其发送回请求者。我们继续进行授权,如果请求者未获得授权,则检查请求者可以做什么,然后将其发送回浏览器。
- 如果用户通过了两个阶段,那么管道将向前移动,因此在执行该方法之前已经选择了要执行的方法,它需要填充参数,这就是模型绑定的来源。所以它从请求中获取数据并使用该数据来创建请求者对象。在传递给定方法的所有参数之后,动作调用者就可以调用该方法。模型绑定器本身检索数据以填充来自值提供者的操作方法参数。
- MVC 提供了四个默认提供程序,它们从常见位置收集数据,即表单数据、路由数据、查询字符串、文件,这些类提供来自与当前请求相关的各种来源的信息,然后执行操作过滤器。它执行了两个方法,即在操作方法之前触发的OnActionExecuting和之后触发的OnActionExecuted ,因此此时运行 OnActionExecuting 过滤器,因此在这些执行完成后最终操作方法调用自身它返回操作结果简而言之它确定并准备响应的类型它将在 OnActionExecuted 过滤器运行之后处理请求,这允许我们在结果执行之前将逻辑添加到管道中。
在构建中,MVC 提供了动作过滤器:
输出缓存:此过滤器用于将操作的输出缓存一段时间。
处理错误:此过滤器用于处理由操作或控制器引起的错误,如果发生任何异常,它将操作重定向到自定义错误页面。
授权:此过滤器用于过滤授权用户访问资源。
注意:我们可以通过实现特定的过滤器接口类来创建自定义过滤器。
查看结果执行流程:
下一阶段,
- 动作结果执行由动作调用者在结果执行之前触发,相关的结果过滤器首先运行此过滤器还公开两个方法。
- 第一个OnResultExecuting在动作结果之前触发,在此方法运行后调用动作结果的执行结果。 MVC 提供了不同类型的操作结果 执行结果提供了两条路径之间的管道分支 如果结果是视图或部分视图形式,则视图引擎呈现视图,如果结果是另一种形式,则此结果通常处理写入自己响应。在运行结果过滤器的onResultExecuted方法之后。这是 MVC 注入您自己的逻辑的最后一点
动作结果执行过程:
下一阶段,
- 查看呈现过程 当 Action Invoker 对该对象调用ExecuteResult方法时开始。
- 在查看结果的情况下,ExecuteResult 方法实际上是在一个名为 ViewResultBase 的父类上定义的。因此调用者调用基类的 ExecuteResult 方法,该方法又调用一个名为 FindView 的抽象方法。子 ViewResult 类覆盖此方法并使用它来要求 View Engine 找到正确的 View。 View Engine 返回一个 ViewEngineResult,它将包含获取的 View 或它尝试搜索的位置列表。视图只不过是一个实现 IView 接口的类,它只定义了一种称为 Render 的方法。 Render 是最终将模板的内容写入请求响应的方法。
这就是 MVC 生命周期的全部内容。