MVC 实现计算页面执行时间
使用 ActionFilterAttribute 来实现:
public class PerformanceActionAttribute:ActionFilterAttribute
{
public string Message { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//在Action执行前执行 GetTimer(filterContext, "action").Start(); base.OnActionExecuting(filterContext);
} public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//在Action执行之后执行
var actionTimer = GetTimer(filterContext, "action");
//GetTimer(filterContext, "action").Stop();
actionTimer.Stop();
base.OnActionExecuted(filterContext);
string extime = "页面执行耗时" + actionTimer.ElapsedMilliseconds+"毫秒";
filterContext.HttpContext.Response.Headers.Add("extime",extime);
//在这里显示给用户的时间只是action的执行时间,如果在view中有执行调用代码的部分,则时间不会
//记录在内,所以这里的时间不是很准,但是这个时间可以很自由的被view中的代码调用显示,使得界面可以按照
//自己的意愿进行显示
} public override void OnResultExecuting(ResultExecutingContext filterContext)
{
GetTimer(filterContext, "render").Start(); base.OnResultExecuting(filterContext);
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//在Result执行之后
//这里使用response.write输出只能是输出到documnet的最后部分,不能按照想法显示到指定的随意位置
//所以这里隐藏显示了。
//这这部分使用response.Headers是无效的,因为当执行这部分内容的时候,view已经渲染完了,在这添加到Header
//中的值,无法在页面获得
var renderTimer = GetTimer(filterContext, "render");
renderTimer.Stop(); var actionTimer = GetTimer(filterContext, "action");
var response = filterContext.HttpContext.Response; if (response.ContentType == "text/html")
{
response.Write(
String.Format(
"<p id='pidtimeelapse' style='display:none;'>Action '{0} :: {1}', Execute: {2}ms, Render: {3}ms.</p>",
filterContext.RouteData.Values["controller"],
filterContext.RouteData.Values["action"],
actionTimer.ElapsedMilliseconds,
renderTimer.ElapsedMilliseconds
)
); } base.OnResultExecuted(filterContext);
} private Stopwatch GetTimer(ControllerContext context, string name)
{
string key = "__timer__" + name;
if (context.HttpContext.Items.Contains(key))
{
return (Stopwatch)context.HttpContext.Items[key];
} var result = new Stopwatch();
context.HttpContext.Items[key] = result;
return result;
}
}
在action 处使用 见第一行
[PerformanceAction]
public ActionResult Index(string type="默认",int pageIndex=)
{
string orderType = type;
int pageSize = pageSizeCom;
int total = ;
List<vArticleMain> list = artBLL.GetArticleByPage(pageIndex, pageSize, orderType, out total);
ViewBag.list = list; //分页信息 ViewBag.pageIndex = pageIndex;
ViewBag.pageCount = total;
ViewBag.type = type; return View();
}
在view 中显示 可以在指定位置引用
<div class="row col-md-12">
@Response.Headers.Get("extime")
</div>
还有一种是使用 httpmodule的方法,使用该方法不用在每个action上加特性了
地址:http://haacked.com/archive/2008/07/02/httpmodule-for-timing-requests.aspx/
但是在使用该方法调试的时候,出现一个进程中有多个线程的情况,该方法多次执行。而时间编程是单线程的,没有定义多线程,不知道为什么会出现多线程情况。
所以没有使用该方法。(该方法得到的时间比filter的方法得到的时间要更准确)
filter方法参考链接:http://bradwilson.typepad.com/blog/2010/07/aspnet-mvc-filters-and-statefulness.html
http://www.sharejs.com/codes/csharp/6235
http://blog.csdn.net/keepitshortandsimple/article/details/7357954
第二天想到新的解决办法,思路就是:OnResultExecuted 中最后输出的代码虽然不在服务器端的view中用response取得,只能输出到页面的最后部分,
但是当信息传输到浏览器上的时候,可以用jquery 来取得输出的内容,然后显示到指定的位置。OnResultExecuted 方法只是在view页面在服务器端渲染完之后执行,
不是在浏览器上显示完之后执行,所以可以在浏览器上取得在OnResultExecuted 阶段输出的内容。
attribute的代码 :在 OnActionExecuted 阶段不再输出内容
public class PerformanceActionAttribute:ActionFilterAttribute
{
public string Message { get; set; } public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//在Action执行前执行 GetTimer(filterContext, "action").Start(); base.OnActionExecuting(filterContext);
} public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//在Action执行之后执行
//var actionTimer = GetTimer(filterContext, "action");
GetTimer(filterContext, "action").Stop();
//actionTimer.Stop();
base.OnActionExecuted(filterContext);
//string extime = "页面执行耗时" + actionTimer.ElapsedMilliseconds+"毫秒";
//filterContext.HttpContext.Response.Headers.Add("extime",extime); //在这里显示给用户的时间只是action的执行时间,如果在view中有执行调用代码的部分,则时间不会
//记录在内,所以这里的时间不是很准,但是这个时间可以很自由的被view中的代码调用显示,使得界面可以按照
//自己的意愿进行显示 //想出新的办法了,所以这里注释掉,用下边的总时间
} public override void OnResultExecuting(ResultExecutingContext filterContext)
{
GetTimer(filterContext, "render").Start(); base.OnResultExecuting(filterContext);
} public override void OnResultExecuted(ResultExecutedContext filterContext)
{
//在Result执行之后
//这里使用response.write输出只能是输出到documnet的最后部分,不能按照想法显示到指定的随意位置
//所以这里隐藏显示了。
//这这部分使用response.Headers是无效的,因为当执行这部分内容的时候,view已经渲染完了,在这添加到Header
//中的值,无法在页面获得 //第二天想出新的方法来解决
//如下所以,输出到页面的内容放到固定标签中,有ID,然后再页面上用js来取得对应的内容,然后相加,显示到指定的位置
var renderTimer = GetTimer(filterContext, "render");
renderTimer.Stop(); var actionTimer = GetTimer(filterContext, "action");
var response = filterContext.HttpContext.Response; if (response.ContentType == "text/html")
{
response.Write(
String.Format(
"<p id='disAction' style='display:block;'>Action '{0} :: {1}' <span id='disexecute'>{2}</span><span id='disrender'>{3}</span></p>",
filterContext.RouteData.Values["controller"],
filterContext.RouteData.Values["action"],
actionTimer.ElapsedMilliseconds,
renderTimer.ElapsedMilliseconds
)
); } base.OnResultExecuted(filterContext);
} private Stopwatch GetTimer(ControllerContext context, string name)
{
string key = "__timer__" + name;
if (context.HttpContext.Items.Contains(key))
{
return (Stopwatch)context.HttpContext.Items[key];
} var result = new Stopwatch();
context.HttpContext.Items[key] = result;
return result;
}
}
在controller中的内容不变,
在view中的内容:
<div id="pagetime" class="row col-md-12"> </div>
jquery
$(function () {
var disexecute = $("#disexecute").html();
var disrender = $("#disrender").html();
var ht = "页面执行耗时" + (parseInt(disexecute) + parseInt(disrender)) + "毫秒";
$("#pagetime").html(ht);
});
这样就比较完美了
MVC 实现计算页面执行时间的更多相关文章
- PHP 计算页面执行时间
PHP 计算页面执行时间 < ?php class runtime { var $StartTime = 0; var $StopTime = 0; function get_microtime ...
- 一:理解ASP.NET的运行机制(例:通过HttpModule来计算页面执行时间)
一:简要介绍一下asp.net的执行步骤 1.IIS接收到客户请求 2. IIS把请求交给aspnet_isapi.dll处理 3.(如果是第一次运行程序)装载bin目录中的dll 4.(如果是第一次 ...
- 在Asp.Net MVC中实现计算页面执行时间及简单流量统计
引用www.rsion.com.dll进您的asp.net MVC项目本人不才,源代码中有详细说明,查看demo修改HomeController public class HomeController ...
- 三行代码实现.NET MVC统计显示页面的执行时间 超简单的实现方法 分析页面执行效率
三行代码实现.NET MVC统计显示页面的执行时间 超简单的实现方法 分析页面执行效率 博客页脚处添加了页面执行时间统计显示,如下图所示,也可以直接查看网页页脚处. 实现方法非常简单,只需三行代 ...
- PHP获取页面执行时间的方法
一些循环代码,有时候要知道页面执行的时间,可以添加以下几行代码到页面头部和尾部: 头部: <?php $stime=microtime(true); 尾部: $etime=microtime(t ...
- PHP获取页面执行时间的方法(推荐)
一些循环代码,有时候要知道页面执行的时间,可以添加以下几行代码到页面头部和尾部: 头部:$stime=microtime(true); 尾部: $etime=microtime(true);//获取程 ...
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
[问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...
- 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理
系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...
- 学习笔记:Asp.Net MVC更新部分页面
Asp.Net MVC 更新部分页面 设想我们有一篇文章下面的提交评论时如何只刷新评论内容部分, 方法一,利用ajax通过js代码实现. 方法二,利用Ajax.BeginForm()+部分视图实现. ...
随机推荐
- 选择排序O(n^2)与快速排序O(nlogn)的优越性代码体现
随机函数生成一个超大数组: [code]: #include <iostream> #include <stdio.h> #include<time.h> #inc ...
- PAT-乙级-1019. 数字黑洞 (20)
1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...
- [Database]Operators
Arithmetic Operators +,-,×,÷ Comparison Operators =,<>,!=,>,<,>=,<= BETWEEN,IN,IS ...
- C++ 嵌套类使用(三)
如果嵌套类型和其外部类型之间的关系需要成员可访问性语义,需要使用C++嵌套类,嵌套类型不应针对其声明类型以外的类型执行任务,而C++局部类允许类.结构和接口被分成多个小块儿并存储在不同的源文件中,这样 ...
- POJ2031Building a Space Station
http://poj.org/problem?id=2031 题意:你是空间站的一员,太空里有很多球形且体积不一的“小房间”,房间可能相距不近,也可能是接触或者甚至是重叠关系,所有的房间都必须相连,这 ...
- SGU 168
SGU 168,寻找矩阵中右上方,右方,下方最小的元素,采用动态规划解答. #include <iostream> #include <vector> #include < ...
- Android invalidate()自动清屏,屏幕刷新
invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧 ...
- 非常实用的15款开源PHP类库
PHP库给开发者提供了一个标准接口,它帮助开发者在PHP里充分利用面向对象编程.这些库为特定类型的内置功能提供了一个标准的API,允许类可以与PHP引擎进行无缝的交互.此外,开发者使用这些类库还可以简 ...
- 【HDOJ】4297 One and One Story
综合性很强的题目.存在环,可以用tarjan处理,然后需要求LCA.并查集+RMQ可以搞.非常不错的题目. /* 4297 */ #include <iostream> #include ...
- amoeba-mysql配置安装(收集整理)
本文收集整理自: Amoeba搞定mysql主从读写分离 http://blog.chinaunix.net/uid-20639775-id-154600.html Amoeba非常好用的mysql集 ...