簡體   English   中英

C#ASP.NET MVC:顯示頁面渲染時間

[英]C# ASP.NET MVC: Show Page Render Time

我想通過母版頁向我的所有ASP.NET MVC頁面添加一個輸出,顯示當前頁面的渲染時間。 我怎么能這樣做?

這很棘手,因為在您可以渲染頁面之前,您必須將所有ViewData添加到其中。

您可以通過編寫自定義ActionFilterAttribute並重寫OnActionExecuting以啟動計時器來獲取執行控制器操作所花費的總時間,並通過OnActionExecuted獲取已用時間並將其存儲到ViewData 執行ActionResult時,可能需要花費時間並將其渲染到View中。

這可能足以滿足您的需求? 不幸的是,為了獲得Action和Result執行的總時間,你需要在Controller中覆蓋OnActionExecutingOnResultExecuted ,但是在那時為View添加信息為時已晚,因為它已經被渲染了。 您可以將其記錄到文件中,但請參閱此鏈接以獲取示例


好的,這是一個示例計時器動作過濾器。 將此類作為類添加到項目中,然后可以使用[ActionTimer]標記任何控制器方法,並將經過的時間添加到名為“ _ElapsedTime ”的ViewData存儲桶中,您可以在視圖中打印出來。

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花費的時間。 如果您看一下我鏈接的示例,它會向您展示如何對日志文件執行此操作,並且還可以讓您了解如何使用這四個操作過濾器事件。

如果要對Action進行計時 ,可以創建一個IActionFilter ,它具有OnActionExecutingOnActionExecuted的啟動和停止事件。 但那只是控制器時間。

要抓住全部時間 ,您還需要知道IResultFilter的啟動和停止時間,其中包含事件OnResultExecutingOnResultExecuted

是實際寫入到 OnResultExecuted 響應示例 ,因此它表明這樣仍可能在那個時候。 它在OnResultExecuted方法中執行filterContext.HttpContext.Response.Write調用。

對於我個人使用,我只想知道誰在做什么,哪些頁面受到打擊,性能明智,什么花了太多時間。 我將其記錄到數據庫,但不要將其放在每個頁面上。 (如果經過身份驗證,我還會存儲用戶,以下未顯示。)

特別是,它是針對DevExpress大數據網格,這使我不僅需要對Action進行計時,還要開始對結果進行計時。

 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 
        {

        }
    }

}

我建議使用JavaScript。

在頁面加載開始時有兩次,在頁面末尾有一次,然后你可以對總時間做一些改變。

通過從客戶端腳本執行此操作,您可以獲得加載頁面的整個時間與服務器所需的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM