如何显示在页脚中生成页面所需的持续时间?

时间:2010-06-14 07:27:18

标签: asp.net asp.net-mvc asp.net-mvc-2

在调试版本中,我想显示服务器端在页脚中生成页面所花费的时间。

因此,例如,如果页面需要250毫秒服务器端,我希望在页脚中显示,在调试版本中。如何在ASP.NET MVC项目中实现此目的?

2 个答案:

答案 0 :(得分:5)

将其添加到母版页中的页脚:

Page rendering took <%= DateTime.Now.Subtract( this.ViewContext.HttpContext.Timestamp ).TotalMilliseconds.ToString() %>

您也可以将其包装在扩展方法中:

public static class Extensions
{
  public static string RequestDurationinMs( this HtmlHelper helper )
  {
    #if DEBUG
    return DateTime.Now.Subtract( helper.ViewContext.HttpContext.Timestamp ).TotalMilliseconds.ToString();
    #endif
  }
}

像这样使用:

<%= Html.RequestDurationinMs() %>

您可能需要导入扩展类的命名空间: <%@ Import Namespace="Your.Namespace" %>

答案 1 :(得分:1)

Marnix建议的ViewContext.HttpContext.Timestamp事情很聪明,我没有意识到那里存在。但是,您也可以将它作为HttpModule来实现,它也适用于非MVC应用程序:

using System;
using System.Web;

namespace MyLibrary
{
    public class PerformanceMonitorModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestContent += delegate(object sender, EventArgs e)
            {
                HttpContext httpContext = ((HttpApplication)sender).Context;
                if (httpContext.Response.ContentType == "text/html")
                {
                    DateTime timestamp = httpContext.Timestamp;

                    double seconds = (double)DateTime.Now.Subtract(timestamp).Ticks / (double)TimeSpan.TicksPerSecond;
                    string result = String.Format("{0:F4} seconds ({1:F0} req/sec)", seconds, 1 / seconds);

                    httpContext.Response.Write("<div style=\"position: fixed; right: 5px; bottom: 5px; font-size: 15px; font-weight: bold;\">Page Execution Time: " + result + "</div>");
                }
            };
        }
    }
}

然后把它放到你的web.config中:

<httpModules>
    <!-- Other httpModules (snip) -->

    <add name="PerformanceMonitor" type="MyLibrary.PerformanceMonitorModule, MyLibrary"/>
</httpModules>

这将记录在将HTML内容发送到浏览器之前的最后时刻,以便尽可能多地测量HTTP管道。不确定在页面标记中粘贴ViewContext.HttpContext.Timestamp是否可以实现此目的?

注意:这不会产生有效的HTML标记,因为它会将<div>吐出到页面底部,因此仅用于开发/性能分析。

编辑:我修改了HttpModule以使用HttpContext.Timestamp而不是在Request上下文中存储Stopwatch对象,因为它似乎可以提供更准确的结果。