Время генерации страницы - ASP.Net MVC - PullRequest
15 голосов
/ 01 декабря 2009

Я ищу способ отследить, как долго сервер генерирует страницу. Я знаю, что могу использовать Trace для отслеживания этого, но мне нужен способ отобразить это на странице.

Это ASP.Net MVC 2

Ответы [ 3 ]

15 голосов
/ 01 декабря 2009

Вы можете реализовать это как ActionFilterAttribute

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class LoggingAttribute : ActionFilterAttribute
{
    private readonly Stopwatch _sw;

    public LoggingAttribute()
    {
        _sw = new Stopwatch();
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _sw.Start();
        Debug.WriteLine("Beginning executing: " + GetControllerAndActionName(filterContext.ActionDescriptor));
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        _sw.Stop();
        var ms = _sw.ElapsedMilliseconds;

        Debug.WriteLine("Finishing executing: " + GetControllerAndActionName(filterContext.ActionDescriptor));
        Debug.WriteLine("Time elapsed: "+ TimeSpan.FromMilliseconds(ms).TotalSeconds);
    }

    private string GetControllerAndActionName(ActionDescriptor actionDescriptor)
    {
        return actionDescriptor.ControllerDescriptor.ControllerName + " - " + actionDescriptor.ActionName;
    }
}

Украсьте им каждый контроллер или action-метод и вуаля, он выплевывает текст при отладке.

РЕДАКТИРОВАТЬ: Если вы хотите напечатать его на странице, вы можете добавить этот фрагмент в метод OnActionExecuted

if(filterContext.Result is ViewResult) { //Make sure the request is a ViewResult, ie. a page
  ((ViewResult) filterContext.Result).ViewData["ExecutionTime"] = ms; //Set the viewdata dictionary
}

Теперь у вас есть время выполнения, сохраненное в ViewData, и вы можете получить к нему доступ на странице. Обычно я помещаю его в мастер-страницу следующим образом:

<!-- The page took <%= ViewData["ExecutionTime"] %> ms to execute -->
14 голосов
/ 01 декабря 2009

Да, предложение Derin - это стандартный способ сделать это в приложении ASP.NEt, я бы просто предложил добавить if, чтобы он не мешал ответам, отличным от HTML: РЕДАКТИРОВАТЬ: добавлена ​​полная реализация

public class PerformanceMonitorModule : IHttpModule
{

    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += delegate(object sender, EventArgs e)
        {
            //Set Page Timer Star
            HttpContext requestContext = ((HttpApplication)sender).Context;
            Stopwatch timer = new Stopwatch();
            requestContext.Items["Timer"] = timer;
            timer.Start();
             };
        context.PostRequestHandlerExecute += delegate(object sender, EventArgs e)
        {

            HttpContext httpContext = ((HttpApplication)sender).Context;
            HttpResponse response = httpContext.Response;
            Stopwatch timer = (Stopwatch)httpContext.Items["Timer"];
            timer.Stop();

            // Don't interfere with non-HTML responses
            if (response.ContentType == "text/html")
            {
                double seconds = (double)timer.ElapsedTicks / Stopwatch.Frequency;
                string result_time = string.Format("{0:F4} sec ", seconds);
                RenderQueriesToResponse(response,result_time);
            }
        };
    }
    void RenderQueriesToResponse(HttpResponse response, string result_time)
    {
        response.Write("<div style=\"margin: 5px; background-color: #FFFF00\"");
        response.Write(string.Format("<b>Page Generated in "+ result_time));
        response.Write("</div>");
    }
    public void Dispose() { /* Not needed */ }
}

Вы также можете добавить стиль ...

И не забудьте зарегистрировать свой Модуль в WebConfig в разделе httpModules:

  <add name="Name" type="namespace, dll"/>

Полный справочник об этой проверке Стивена Сандерсона (Steven Sanderson) - Pro ASP.NET MVC Framework - Глава 15 - Производительность, мониторинг времени генерации страниц.

РЕДАКТИРОВАТЬ: (комментарий @Pino) Вот пример для моего проекта: альтернативный текст http://www.diarioplus.com/files/pictures/example_performance.JPG

4 голосов
/ 01 декабря 2009

Это будет зависеть от того, где вы хотите включить эту информацию. Например, вы можете написать обработчик http, который будет отображать время рендеринга после тега </html>:

public class RenderTimeModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += (sender, e) =>
        {
            var watch = new Stopwatch();
            var app = (HttpApplication)sender;
            app.Context.Items["Stopwatch"] = watch;
            watch.Start();
        };

        context.EndRequest += (sender, e) =>
        {
            var app = (HttpApplication)sender;
            var watch = (Stopwatch)app.Context.Items["Stopwatch"];
            watch.Stop();
            var ts = watch.Elapsed;
            string elapsedTime = String.Format("{0} ms", ts.TotalMilliseconds);
            app.Context.Response.Write(elapsedTime);
        };
    }

    public void Dispose()
    {
    }
}

Если вы хотите отобразить время рендеринга где-то посередине html-страницы, тогда это время рендеринга не будет учитывать общее время рендеринга страницы.

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