![](/img/trans.png)
[英]Parse JSON dynamically in c# (.NET) show on ASP.NET MVC PAGE
[英]C# ASP.NET MVC: Show Page Render Time
我想通過母版頁向我的所有ASP.NET MVC頁面添加一個輸出,顯示當前頁面的渲染時間。 我怎么能這樣做?
這很棘手,因為在您可以渲染頁面之前,您必須將所有ViewData添加到其中。
您可以通過編寫自定義ActionFilterAttribute
並重寫OnActionExecuting
以啟動計時器來獲取執行控制器操作所花費的總時間,並通過OnActionExecuted
獲取已用時間並將其存儲到ViewData
。 執行ActionResult時,可能需要花費時間並將其渲染到View中。
這可能足以滿足您的需求? 不幸的是,為了獲得Action和Result執行的總時間,你需要在Controller中覆蓋OnActionExecuting
和OnResultExecuted
,但是在那時為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 ,它具有OnActionExecuting , OnActionExecuted的啟動和停止事件。 但那只是控制器時間。
要抓住全部時間 ,您還需要知道IResultFilter的啟動和停止時間,其中包含事件OnResultExecuting , OnResultExecuted 。
這是實際寫入到 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.