使用Filter跟蹤ASP.NET MVC頁面載入時間
最近,客戶一直反饋系統使用慢,有時候能夠指出具體是哪個頁面,有時候又只是籠統地反饋慢。這種問題就像是幽靈一樣,非常不好處理。因為導致這種問題的因素非常之多,而且在開發工程中,很難模擬出實際執行是的環境。理論上,對於所有的頁面做壓力測試是個解決方案,但是這種方式的成本太高,又沒有辦法很快地定位和解決客戶的問題。
最後,考慮通過建立Filter來在訪問Action之前記錄一個時間,在頁面Render完成之後,再記錄一下時間。通過比較這2個時間的差值來跟蹤每個頁面的載入效能。如果對於MVC中的Filter還不太熟悉,可以看這裡Asp.net MVC使用Filter解除Session, Cookie等依賴,文章有對於Filter的介紹和使用。
言歸正傳,直接上程式碼。通過繼承ActionFilterAttribute, 分別重寫OnActionExecuting和OnResultExecuted方法。
public class TrackPageLoadPerformanceAttribute : ActionFilterAttribute { //這裡使用log4net來列印出結果 private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); //建立字典來記錄開始時間,key是訪問的執行緒Id. private readonly Dictionary<int, DateTime> _start = new Dictionary<int, DateTime>(); //建立字典來記錄當前訪問的頁面Url. private readonly Dictionary<int, string > _url = new Dictionary<int, string>(); public override void OnActionExecuting(ActionExecutingContext filterContext) { //過濾掉ChildAction, 因為ChildAction實際上不是一個單獨的頁面 if(filterContext.IsChildAction) return; var currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; try { _start.Add(currentThreadId, DateTime.Now); _url.Add(currentThreadId, filterContext.HttpContext.Request.Url == null ? string.Empty : filterContext.HttpContext.Request.Url.AbsoluteUri); } catch (Exception ex) { Log.Error(ex.ToString()); } } public override void OnResultExecuted(ResultExecutedContext filterContext) { var currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; if (!_start.ContainsKey(currentThreadId)) return; try { //計算出當前頁面訪問耗時 var costSeconds = (DateTime.Now - _start[currentThreadId]).TotalSeconds; if (costSeconds > 2)//如果耗時超過2秒,就是用log4net列印出,具體是哪個頁面訪問超過了2秒,具體使用了多長時間。 { Log.Info(string.Format("Access the action more than 2 seconds. cost seconds {1}. URL: {0}", _url[currentThreadId], costSeconds)); } } catch (Exception ex) { Log.Error(ex.ToString()); } finally { _start.Remove(currentThreadId); _url.Remove(currentThreadId); } } }
最後,將該Filter註冊成Global Filter,這樣,就能監控系統中所有頁面的載入時間了.
如果你也遇到和我類似的效能問題,不妨試試,加上這個Filter, online系統中哪個頁面慢,就能夠一目瞭然了。
相關文章
- 【Longkin】ASP.NET應用程式跟蹤---(一)跟蹤頁面ASP.NET
- asp.net 頁面載入ASP.NET
- ASP.NET MVC FilterASP.NETMVCFilter
- asp.net mvc 錯誤頁面ASP.NETMVC
- 一種新的頁面載入時間檢測方式
- Mac好用的時間跟蹤器Mac
- 使用Web元件載入頁面Web元件
- Asp.net core mvc裡面怎麼新增全域性的FilterASP.NETMVCFilter
- [ASP.NET MVC 小牛之路]11 - FilterASP.NETMVCFilter
- ASP.NET MVC 4使用PagedList.Mvc分頁ASP.NETMVC
- ASP.NET MVC使用Filter解除Session, Cookie等依賴ASP.NETMVCFilterSessionCookie
- 關於頁面載入耗時測試
- 無線效能優化:頁面可見時間與非同步載入優化非同步
- MarketingCharts:零售網站頁面平均載入時間增加22%GC網站
- 在Asp.net MVC中訪問靜態頁面ASP.NETMVC
- 學習ASP.NET MVC(六)——我的第一個ASP.NET MVC 編輯頁面ASP.NETMVC
- Timemator自動化時間跟蹤軟體
- ASP.NET Core 5.0 MVC中的 Razor 頁面 介紹ASP.NETMVC
- Asp.Net MVC 系列--進階篇之FilterASP.NETMVCFilter
- ASP.NET頁面間傳值彙總ASP.NET
- Javascript在頁面載入時的執行順序JavaScript
- 好用的時間跟蹤定時器:Eon Timer for Mac定時器Mac
- 一款小巧的時間跟蹤器:Klokki for MacMac
- Timemator for Mac(自動化時間跟蹤軟體)Mac
- ASP.Net MVC View中獲取當前頁面引數ASP.NETMVCView
- oracle跟蹤事件(轉載)Oracle事件
- 我是如何將頁面載入時間從6S降到2S的?
- ASP.NET 頁面間資料傳遞方法ASP.NET
- 使用 jQuery Ajax 在頁面滾動時從伺服器載入資料jQuery伺服器
- 頁面載入全過程
- 頁面載入和解析流程
- 頁面載入順序jQueryjQuery
- 啟動載入廣告頁面
- 頁面載入loading
- spring security之 預設登入頁原始碼跟蹤Spring原始碼
- 灌水帖 asp.net非法請求時跳轉到登入頁面ASP.NET
- asp.net core mvc 分頁ASP.NETMVC
- js 進入頁面載入的方法JS