English 中文(简体)
MVC中的页面渲染时间
原标题:
  • 时间:2009-04-03 01:45:33
  •  标签:

Q: 如何计算呈现MVC页面和在主页面上显示时间所需的总时间。

在Asp.net Web Form中,我创建了一个基本页面类,如下所示:

public class PageBase : System.Web.UI.Page
{      
    private DateTime startTime = DateTime.Now;
    private TimeSpan renderTime;   
    public DateTime StartTime
    {
        set { startTime = value; }
        get { return startTime; }
    }  
    public virtual string PageRenderTime
    {
        get
        {
            renderTime = DateTime.Now - startTime;
            return renderTime.Seconds + "." + renderTime.Milliseconds + " seconds";
        }
    }       
}

然后,我会在母版页上调用该方法,如下所示:

<div id="performance">
     <% =PageRenderTime %>
</div>

Q: 我如何使用MVC框架完成同样的事情?

Q: 使用MVC框架,我在哪里设置页面首次创建的开始时间?

最佳回答

The best way to do this is calculate the request timing .. Begin Request and End Request .... Check out this great post:

http://haacked.com/archive/2008/07/02/httpmodule-for-timing-requests.aspx

问题回答

进入你的web.config并确保你有。。。

<system.web>
    <trace enabled="true" localOnly="false" />
</system.web>

然后您可以转到http://.../trace.axd并查看每个请求。

然后,您需要查看From First(s)列,最后一列是呈现页面(服务器端)所花费的时间。

实例

aspx.page   End Render  0.06121112  0.005297

61.2毫秒以呈现页面。

如果要查看时间代码本身,或者要手动执行某些诊断,则需要使用System.diagnostics.Stopwatch类,而不是DateTime。

Stopwatch sw = Stopwatch.StartNew();
...
sw.Stop();
Trace.Write(sw.ElapsedMilliseconds);

我可能会覆盖OnActionExecutingController类上的OnActionExecuted方法。

public class BaseController : Controller {
    // Called before the action is executed
    public override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        // Start timing
    }

    // Called after the action is executed
    public override void OnActionExecuted(ActionExecutedContext ctx) {
        base.OnActionExecuted(ctx);
        // Stop timing
    }
}

创建一个基本控制器并从中派生控制器。在构造函数中设置开始时间并重写Dispose(),然后将总时间的计算放在那里。这应该会给你一个完整的行动生命周期。由于Controller实现了IDisposable,我假设渲染引擎将在计算结果后处理它,您不必等待垃圾收集。如果我的假设被证明是错误的,您可以使用OnResultExecuted()。

编辑:要在页面上获得渲染时间将相对困难,因为根据定义,在您的时间被放在页面上之前,页面无法完成渲染,并且在页面完成渲染之前,您没有时间。但是,您可以将渲染时间写入会话,然后使用AJAX返回并获取渲染时间以便稍后显示。您可以通过将开始时间放在ViewData中并计算视图本身中的渲染时间来近似它。您可能想尝试记录渲染时间并进行视图近似,看看它有多接近。

此代码可用于记录渲染时间。

public class BaseController : Controller
{
   private DateTime StartTime { get; set; }
   public BaseController() : base()
   {
       StartTime = DateTime.Now;
   }

   public override void Dispose( bool disposing )
   {
       var totalTime = DateTime.Now - this.StartTime;
       ... write it out somewhere ...
   }
}




相关问题
热门标签