C # ASP.NET MVC: Показать время отображения страницы - PullRequest
7 голосов
/ 15 сентября 2009

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

Ответы [ 3 ]

10 голосов
/ 15 сентября 2009

Это сложно, потому что, прежде чем вы сможете отобразить страницу, вам нужно добавить все ваши ViewData.

Общее время выполнения действия контроллера можно получить, написав пользовательский ActionFilterAttribute и переопределив OnActionExecuting, чтобы запустить таймер, и OnActionExecuted, чтобы получить истекшее время и сохранить его в ViewData. Когда выполняется ActionResult, он может занять это время и отобразить его в вашем представлении.

Это может быть достаточно близко для ваших нужд? К сожалению, чтобы получить общее общее время выполнения и действия, и результата, вам нужно переопределить OnActionExecuting и OnResultExecuted в вашем контроллере, но в этот момент уже слишком поздно добавлять информацию в представление, так как уже были оказаны. Вы можете записать его в файл, однако, см. Эту ссылку для примера .

<ч />

Хорошо, вот пример фильтра действий таймера. Добавьте это как класс в свой проект, и затем вы можете пометить любой метод контроллера с помощью [ActionTimer], и это добавит затраченное время в корзину ViewData с именем "_ElapsedTime", которую вы можете распечатать в ваших представлениях.

using System.Web.Mvc; 
using System.Diagnostics;

namespace MvcApplication1  {
    public class ActionTimerAttribute : ActionFilterAttribute
        {
            public ActionTimerAttribute()
            {
                // Make sure this attribute executes after every other one!
                this.Order = int.MaxValue;
            }

            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                var controller = filterContext.Controller;
                if (controller != null)
                {
                    var timer = new Stopwatch();
                    controller.ViewData["_ActionTimer"] = timer;
                    timer.Start();
                }
                base.OnActionExecuting(filterContext);
            }

            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                var controller = filterContext.Controller;
                if (controller != null)
                {
                    var timer = (Stopwatch)controller.ViewData["_ActionTimer"];
                    if (timer != null)
                    {
                        timer.Stop();
                        controller.ViewData["_ElapsedTime"] = timer.ElapsedMilliseconds;
                    }
                }
            }
        } }

Как я упоминал ранее, это не будет включать время, необходимое для фактического рендеринга ActionResult. Если вы посмотрите на пример, который я связал, он покажет вам, как вы можете сделать это с файлом журнала, а также даст представление о том, как можно использовать четыре события фильтра действий.

0 голосов
/ 19 ноября 2015

Если вы хотите время действия , вы можете создать IActionFilter , который имеет события запуска и остановки OnActionExecuting , OnActionExecuted, Но это только время контроллера.

Чтобы получить полный рабочий день , вам также необходимо знать IResultFilter время запуска и остановки, в котором есть события OnResultExecuting , OnResultExecuted .

Этот является примером , который на самом деле записывает в ответ в OnResultExecuted , поэтому он предлагает такие может быть еще возможно в то время. Он выполняет filterContext.HttpContext.Response.Write вызов в методе OnResultExecuted.

Для личного пользования я просто хочу знать, кто чем занимается, какие страницы попадают в список, и с точки зрения производительности, что занимает слишком много времени. Я регистрирую это в базе данных, но не помещаю это на каждую страницу. (Я также сохраняю пользователя, если он аутентифицирован, что не показано ниже.)

В частности, это было для DevExpress Large Data Grid, что заставило меня не только рассчитать время действия, но и запустить также результат.

 public class Log : FilterAttribute, IActionFilter, IResultFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        try
        {
            var db = new SomeExampleEntities();
            WebLog webLog = new WebLog();

            webLog.LogDate = DateTime.Now;

            // Whatever you want to log
            webLog.Path = filterContext.HttpContext.Request.Path;
            webLog.IPAddress = filterContext.HttpContext.Request.UserHostAddress;
            webLog.SessionId = filterContext.HttpContext.Session.SessionID;

            db.WebLogs.Add(webLog);
            db.SaveChanges();

            filterContext.HttpContext.Items["WebLog"] = webLog;
            filterContext.HttpContext.Items["WebLog_db"] = db;
        }
        catch
        {

        }
    }

    // This is fired when leaving the controller action, before running the View/Result
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
            WebLog webLog = (WebLog)filterContext.HttpContext.Items["WebLog"];
            webLog.ActionElapsed = (decimal)(((TimeSpan)(DateTime.Now - webLog.LogDate)).TotalMilliseconds / 1000.0000);
    }

    public void OnResultExecuting(ResultExecutingContext filterContext)
    {
        //Do Nothing
    }

    //This is fired after the result is actually executed, not just after the Action returns a View or Result
    public void OnResultExecuted(ResultExecutedContext filterContext)
    {
        try
        {
            UsisWebEntities db = (UsisWebEntities)filterContext.HttpContext.Items["WebLog_db"];
            WebLog webLog = (WebLog)filterContext.HttpContext.Items["WebLog"];

            webLog.Elapsed = (decimal)(((TimeSpan)(DateTime.Now - webLog.LogDate)).TotalMilliseconds / 1000.0000);
            webLog.ResultElapsed = webLog.Elapsed - webLog.ActionElapsed;

            db.SaveChanges();
        }
        catch 
        {

        }
    }

}
0 голосов
/ 15 сентября 2009

Я бы предложил использовать JavaScript.

Имейте два раза один в начале загрузки страницы и один в конце страницы, а затем вы можете внести изменения в общее время.

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

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