使用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页面加载(转)相关推荐
- ASP.NET MVC动态加载数据
ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: <table><tr><th styl ...
- MVC页面加载速度优化小记
前言: 最近做一个地图展示页面,业务初期没什么问题,运行一阵后报错: Error during serialization or deserialization using the JSON Jav ...
- ASP.NET网站页面加载及运行效率等多方面实战优化
网站加载内容较多,图片.Flash等文件较大.请求次数较多.页面不具有缓存性等等都会影响网站的页面加载速度和运行效率.之前做过很多网站,但是基本上都没有进行过优化,比如运用缓存等技术.最近有一个网站加 ...
- 在ASP.NET MVC中加载部分视图的方法及差别
在视图里有多种方法可以加载部分视图,包括Partial() .Action().RenderPartial().RenderAction().RenderPage()方法.下面说明一下这些方法的差别. ...
- Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容
Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/public class WhiteSpaceFilter : Stream{private S ...
- asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度
介绍 使用许多小得JS.CSS文件代替一个庞大的JS或CSS文件来让代码获得更好的可维护性,这是一个很好的实践.但这样做反过来却损失了网站的性能.虽然你应该将你的Javascript代码写在小文件中并 ...
- ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler
ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler, 使用<link type="text/css" rel="Stylesheet" ...
- WEB前端性能优化,提高页面加载速度
可能有人会说:网站的性能是后端工程师的事情,与前端并无多大关系.我只能说,too young too simple.事实上,只有10%~20%的最终用户响应时间是用在从Web服务器获取HTML文档并传 ...
- 在一个html加载多个echarts,Echarts一个页面加载多个图表及图表自适应
Echarts一个页面加载多个图表及图表自适应 模块化加载 //入口 require.config({ paths: { echarts: 'http://echarts.baidu.com/buil ...
最新文章
- 全球最具影响力AI机构TOP100排名:中国5所高校1所研究院入围
- 忠告14:神原裕司郎:成功源于积累
- 编程小白学python知乎周刊_在知乎上学 Python - 入门篇
- Java中,一切皆是对象——java中的对象类型与基本数据类型的区别
- php中get_featured_posts()是什么意思,php – 在WP_Query中获取WooCommerce特色产品
- 面试题: 看下面的程序是否有问题 如果有问题请指出 并说明 (关于数据类型-隐性转换的小陷阱)
- 数据结构与算法--数组中出一次的数字
- 网友写的验证码生成方案,可防止绝大多数机械识别。
- 人工智能案例:车厂特斯拉的花式AI应用...
- 【STM32CubeMx你不知道的那些事】第十章:STM32CubeMx的SPI外置FLASH(W25Q128)+文件系统(FATFS)+虚拟U盘
- Linux系统命令(网络通信)
- 安装SQL Server 2008 及 VS 2008
- android读写access数据库,Android中利用远程Microsoft Access数据库应用程序
- 使用python玩阴阳师,自动抽到SSR
- 将本地端口映射子域名
- Java执行Excel公式
- Jmockit对类静态方法mock
- SpringBoot 自定义实现一个启动器starter 教程。
- Windows CE 模拟器和远程调试工具
- Ansible、Ansible Tower 下载安装
热门文章
- 最大整数(Noip1998连接多位数)
- maven项目project facets中是2.3调整为3.0的解决办法
- INotifyPropertyChanged 接口 CallerMemberName属性
- 使用GruntJS构建Web程序 (1)
- Linux驱动入门篇(一):Hello, world
- Django 发布时间格式化
- Deep Learning 26:读论文“Maxout Networks”——ICML 2013
- 《Linux内核设计与实现》课程学习重点问题总结
- c#中页面之间传值传参的六种方法
- 四门专业课,有点困难哈~