Razor 视图引擎何时将 IActionResult 转换为 HTML?

When does Razor view engine convert IActionResult to HTML?

我们知道 Razor 视图引擎将 ViewResult(IActionResult) 转换为可以发送给用户的 HTML 响应。下面是过滤器管道的图片:

我的问题是,Razor 视图引擎将在哪个阶段启动并执行 IActionResult 到 HTML 的转换,是在 Endpoint 完成执行之后还是在资源过滤器完成执行之后?

好的,我们肯定知道 ViewResult class 的 ExecuteResult 方法调用了视图引擎。

public void ExecuteResult(ControllerContext context)
{
  if (string.IsNullOrEmpty(this.ViewName))
     ViewName = context.RouteData.GetRequiredString("action");
  var viewEngineResult = (ViewEngineResult) null;
  if (View == null)
  {
      viewEngineResult = this.FindView(context);
      View = viewEngineResult.View;
  }
  var output = context.HttpContext.Response.Output;
  View.Render(new ViewContext(context, this.View, this.ViewData, this.TempData, output), output);
  if (viewEngineResult == null)
     return;
  viewEngineResult.ViewEngine.ReleaseView(context, this.View);
}

所以根据上面的代码,我假设 HTML 渲染部分发生在这个方法中。 我们还知道 IResourceFilter 有两个方法(异步版本 IAsyncResultFilter):

void OnResourceExecuting(ResourceExecutingContext context)
void OnResourceExecuted(ResourceExecutedContext context)

第一个方法 OnResourceExecuting 在我们的 api 端点被调用之前执行。

[SimpleResourceFilter]
        public IActionResult Index()
        {
            return View();
        }

并且我们可以声明 ExecuteResult 将在 OnResourceExecuting 之后调用。 要验证首先调用 OnResourceExecuted() 或 ExecuteResult() 的方法,您可以将调试断点放置在它们两者上。这两个方法的调用顺序应该会给你答案。