使用Filter跟踪Asp.net MVC页面加载(转)
轉載地址:http://www.cnblogs.com/JustRun1983/p/4027929.html
最近,客戶一直反饋系統使用慢,有時候能夠指出具體是哪個頁面,有時候又只是籠統地反饋慢。這種問題就像是幽靈一樣,非常不好處理。因為導致這種問題的因素非常之多,而且在開發工程中,很難模擬出實際運行是的環境。理論上,對于所有的頁面做壓力測試是個解決方案,但是這種方式的成本太高,又沒有辦法很快地定位和解決客戶的問題。
最后,考慮通過創建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系統中哪個頁面慢,就能夠一目了然了。
關于Asp.net MVC性能監控,還有這篇文章可能能幫到你。使用MiniProfiler給Asp.net MVC和Entity Framework號脈(附源碼)
轉載于:https://www.cnblogs.com/yxlblogs/p/7088459.html
總結
以上是生活随笔為你收集整理的使用Filter跟踪Asp.net MVC页面加载(转)的全部內容,希望文章能夠幫你解決所遇到的問題。