在调试版本中,我想显示服务器端在页脚中生成页面所花费的时间。
因此,例如,如果页面需要250毫秒服务器端,我希望在页脚中显示,在调试版本中。如何在ASP.NET MVC项目中实现此目的?
答案 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对象,因为它似乎可以提供更准确的结果。