转载地址:http://www.cnblogs.com/JustRun1983/p/4027929.html

最近,客户一直反馈系统使用慢,有时候能够指出具体是哪个页面,有时候又只是笼统地反馈慢。这种问题就像是幽灵一样,非常不好处理。因为导致这种问题的因素非常之多,而且在开发工程中,很难模拟出实际运行是的环境。理论上,对于所有的页面做压力测试是个解决方案,但是这种方式的成本太高,又没有办法很快地定位和解决客户的问题。

最后,考虑通过创建Filter来在访问Action之前记录一个时间,在页面Render完成之后,再记录一下时间。通过比较这2个时间的差值来跟踪每个页面的加载性能。如果对于MVC中的Filter还不太熟悉,可以看这里Asp.net MVC使用Filter解除Session, Cookie等依赖,文章有对于Filter的介绍和使用。

言归正传,直接上代码。通过继承ActionFilterAttribute, 分别重写OnActionExecutingOnResultExecuted方法。

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页面加载(转)相关推荐

  1. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: <table><tr><th styl ...

  2. MVC页面加载速度优化小记

     前言: 最近做一个地图展示页面,业务初期没什么问题,运行一阵后报错: Error during serialization or deserialization using the JSON Jav ...

  3. ASP.NET网站页面加载及运行效率等多方面实战优化

    网站加载内容较多,图片.Flash等文件较大.请求次数较多.页面不具有缓存性等等都会影响网站的页面加载速度和运行效率.之前做过很多网站,但是基本上都没有进行过优化,比如运用缓存等技术.最近有一个网站加 ...

  4. 在ASP.NET MVC中加载部分视图的方法及差别

    在视图里有多种方法可以加载部分视图,包括Partial() .Action().RenderPartial().RenderAction().RenderPage()方法.下面说明一下这些方法的差别. ...

  5. Asp.Net MVC 页面代码压缩筛选器-自定义删除无效内容

    Asp.Net MVC 页面代码压缩筛选器 首先定义以下筛选器,用于代码压缩. /*页面压缩 筛选器*/public class WhiteSpaceFilter : Stream{private S ...

  6. asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度

    介绍 使用许多小得JS.CSS文件代替一个庞大的JS或CSS文件来让代码获得更好的可维护性,这是一个很好的实践.但这样做反过来却损失了网站的性能.虽然你应该将你的Javascript代码写在小文件中并 ...

  7. ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler

    ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler, 使用<link type="text/css" rel="Stylesheet" ...

  8. WEB前端性能优化,提高页面加载速度

    可能有人会说:网站的性能是后端工程师的事情,与前端并无多大关系.我只能说,too young too simple.事实上,只有10%~20%的最终用户响应时间是用在从Web服务器获取HTML文档并传 ...

  9. 在一个html加载多个echarts,Echarts一个页面加载多个图表及图表自适应

    Echarts一个页面加载多个图表及图表自适应 模块化加载 //入口 require.config({ paths: { echarts: 'http://echarts.baidu.com/buil ...

最新文章

  1. 全球最具影响力AI机构TOP100排名:中国5所高校1所研究院入围
  2. 忠告14:神原裕司郎:成功源于积累
  3. 编程小白学python知乎周刊_在知乎上学 Python - 入门篇
  4. Java中,一切皆是对象——java中的对象类型与基本数据类型的区别
  5. php中get_featured_posts()是什么意思,php – 在WP_Query中获取WooCommerce特色产品
  6. 面试题: 看下面的程序是否有问题 如果有问题请指出 并说明 (关于数据类型-隐性转换的小陷阱)
  7. 数据结构与算法--数组中出一次的数字
  8. 网友写的验证码生成方案,可防止绝大多数机械识别。
  9. 人工智能案例:车厂特斯拉的花式AI应用...
  10. 【STM32CubeMx你不知道的那些事】第十章:STM32CubeMx的SPI外置FLASH(W25Q128)+文件系统(FATFS)+虚拟U盘
  11. Linux系统命令(网络通信)
  12. 安装SQL Server 2008 及 VS 2008
  13. android读写access数据库,Android中利用远程Microsoft Access数据库应用程序
  14. 使用python玩阴阳师,自动抽到SSR
  15. 将本地端口映射子域名
  16. Java执行Excel公式
  17. Jmockit对类静态方法mock
  18. SpringBoot 自定义实现一个启动器starter 教程。
  19. Windows CE 模拟器和远程调试工具
  20. Ansible、Ansible Tower 下载安装

热门文章

  1. 最大整数(Noip1998连接多位数)
  2. maven项目project facets中是2.3调整为3.0的解决办法
  3. INotifyPropertyChanged 接口 CallerMemberName属性
  4. 使用GruntJS构建Web程序 (1)
  5. Linux驱动入门篇(一):Hello, world
  6. Django 发布时间格式化
  7. Deep Learning 26:读论文“Maxout Networks”——ICML 2013
  8. 《Linux内核设计与实现》课程学习重点问题总结
  9. c#中页面之间传值传参的六种方法
  10. 四门专业课,有点困难哈~