Идея 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 вместо хранения объекта секундомера в контексте запроса, так как, похоже, он дает более точные результаты.