日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

使用Filter跟踪Asp.net MVC页面加载(转)

發(fā)布時(shí)間:2025/6/17 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Filter跟踪Asp.net MVC页面加载(转) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載地址:http://www.cnblogs.com/JustRun1983/p/4027929.html

最近,客戶一直反饋系統(tǒng)使用慢,有時(shí)候能夠指出具體是哪個(gè)頁(yè)面,有時(shí)候又只是籠統(tǒng)地反饋慢。這種問(wèn)題就像是幽靈一樣,非常不好處理。因?yàn)閷?dǎo)致這種問(wèn)題的因素非常之多,而且在開(kāi)發(fā)工程中,很難模擬出實(shí)際運(yùn)行是的環(huán)境。理論上,對(duì)于所有的頁(yè)面做壓力測(cè)試是個(gè)解決方案,但是這種方式的成本太高,又沒(méi)有辦法很快地定位和解決客戶的問(wèn)題。

最后,考慮通過(guò)創(chuàng)建Filter來(lái)在訪問(wèn)Action之前記錄一個(gè)時(shí)間,在頁(yè)面Render完成之后,再記錄一下時(shí)間。通過(guò)比較這2個(gè)時(shí)間的差值來(lái)跟蹤每個(gè)頁(yè)面的加載性能。如果對(duì)于MVC中的Filter還不太熟悉,可以看這里Asp.net MVC使用Filter解除Session, Cookie等依賴,文章有對(duì)于Filter的介紹和使用。

言歸正傳,直接上代碼。通過(guò)繼承ActionFilterAttribute, 分別重寫(xiě)OnActionExecutingOnResultExecuted方法。

public class TrackPageLoadPerformanceAttribute : ActionFilterAttribute{//這里使用log4net來(lái)打印出結(jié)果private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);//創(chuàng)建字典來(lái)記錄開(kāi)始時(shí)間,key是訪問(wèn)的線程Id.private readonly Dictionary<int, DateTime> _start = new Dictionary<int, DateTime>();//創(chuàng)建字典來(lái)記錄當(dāng)前訪問(wèn)的頁(yè)面Url.private readonly Dictionary<int, string > _url = new Dictionary<int, string>();public override void OnActionExecuting(ActionExecutingContext filterContext){//過(guò)濾掉ChildAction, 因?yàn)镃hildAction實(shí)際上不是一個(gè)單獨(dú)的頁(yè)面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{//計(jì)算出當(dāng)前頁(yè)面訪問(wèn)耗時(shí)var costSeconds = (DateTime.Now - _start[currentThreadId]).TotalSeconds;if (costSeconds > 2)//如果耗時(shí)超過(guò)2秒,就是用log4net打印出,具體是哪個(gè)頁(yè)面訪問(wèn)超過(guò)了2秒,具體使用了多長(zhǎng)時(shí)間。{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注冊(cè)成Global Filter,這樣,就能監(jiān)控系統(tǒng)中所有頁(yè)面的加載時(shí)間了.

如果你也遇到和我類似的性能問(wèn)題,不妨試試,加上這個(gè)Filter, online系統(tǒng)中哪個(gè)頁(yè)面慢,就能夠一目了然了。
關(guān)于Asp.net MVC性能監(jiān)控,還有這篇文章可能能幫到你。使用MiniProfiler給Asp.net MVC和Entity Framework號(hào)脈(附源碼)

轉(zhuǎn)載于:https://www.cnblogs.com/yxlblogs/p/7088459.html

總結(jié)

以上是生活随笔為你收集整理的使用Filter跟踪Asp.net MVC页面加载(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。