Во время сборок отладки я хотел бы показать продолжительность, которую это взяло, сторона сервера, для генерации страницы в нижнем колонтитуле страниц.
Так, например, если бы страница берет сторону сервера на 250 мс, я хотел бы, который отобразился в нижнем колонтитуле в сборках отладки. Как я могу достигнуть этого в проекте MVC ASP.NET?
Добавьте это в нижний колонтитул на главной странице:
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"%>
Фишка 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, потому что при этом будет добавлен РЕДАКТИРОВАТЬ : Я модифицировал HttpModule, чтобы использовать HttpContext.Timestamp вместо хранения объекта секундомера в контексте запроса, поскольку это дает более точные результаты.