Как я отображаю продолжительность, которую это взяло для генерации страницы в нижнем колонтитуле страниц?

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

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

6
задан Sam Saffron 14 June 2010 в 07:27
поделиться

2 ответа

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

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"%>

5
ответ дан 17 December 2019 в 02:24
поделиться

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

1
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: