Как отобразить продолжительность создания страницы в нижнем колонтитуле? - PullRequest
6 голосов
/ 14 июня 2010

Во время отладочных сборок я хотел бы показать длительность, на стороне сервера, для создания страницы в нижнем колонтитуле страниц.

Так, например, если страница занимает 250 мс серверной части, я бы хотел, чтобы это отображалось в нижнем колонтитуле, в отладочных сборках. Как я могу достичь этого в проекте ASP.NET MVC?

Ответы [ 2 ]

5 голосов
/ 14 июня 2010

Добавьте это в нижний колонтитул на главной странице:

<code>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 голос
/ 14 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...