Miniprofiler中的Render步骤中发生了什么?

时间:2013-10-19 06:44:20

标签: c# asp.net-mvc asp.net-mvc-4 profiling mvc-mini-profiler

Miniprofiler告诉我,我页面中最慢的部分是“渲染”步骤(下面附带截图)。

渲染步骤中发生了什么?是将.aspx转换为html发送给客户端的阶段吗?是否有任何地方我可以添加Miniprofiler.Current.Step()以确定它为什么慢?

该应用程序是.NET4.5上的MVC4,带有.aspx渲染引擎。

enter image description here

编辑:

控制器动作只是标准的MVC内容:

public ActionResult Index()
{
    ViewData["foo"] = GetFoo();
    return View(model);
}

ASPX视图是基本的东西,如:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <p><% ViewData["foo"] %></p>
    <% Html.RenderPartial("Something", Model) %>
</asp:Content>

1 个答案:

答案 0 :(得分:2)

首先调用ViewResult方法时会生成View()对象。

这看起来像

return View( Model );

接下来,在ExecuteResult()对象中调用ViewResult方法时,会发生渲染步骤;生成发送到客户端浏览器的 HTML 文档。

ExecuteResult()方法(渲染)过程涉及:

  • 渲染 HTML 元素和 JQuery / * Javascript *属性代替助手
  • 模型绑定到您的视图;;每个帮助程序和模型引用都将替换为模型中的值和/或ViewBag
  • 将您的视图与任何版面合并
  • 渲染Partials

最后一部分,渲染 Partials ,就像创建 ViewResult 对象的递归版本一样。执行PartialView()RenderPartialView()Action()方法会创建 PartialViewResult 对象。此新结果对象还具有ExecuteResult()方法,该方法生成HTML“子文档”以与“父” HTML 文档合并。

如果部分视图具有与之关联的子操作(控制器方法),则部分视图渲染需要更长时间,因为它承担了实例化另一个控制器的负担......

您使用2个部分视图;渲染部分视图的时间在37.1毫秒(占总时间的43%)中合并为16.1毫秒。

关于ASPX View Engine的注意事项:

我敢打赌, aspx 引擎渲染视图的时间比 Razor 引擎要长。 aspx 引擎

  • 有更多的内容(大部分陈旧的网页形式残余)
  • 我不相信自从MVC 3开发(2010年末)以来ASPX引擎已经发展,所以效率可能会降低。

结论:

路由引擎重新解析(4.5毫秒)和控制器实例化(7.3毫秒)相比,渲染视图(ExecuteResult())可能相当耗时。

在您的情况下,渲染局部视图和父视图的时间似乎很高。但是我没有使用迷你探查器来检查自己。

可能是您的 ASPX 视图引擎 THAT 效率低下,或者您可能有 Child 操作与您的部分重量相关数据库调用......