MVC 测试action的运行速度
前言
网络很多文章有关于action的测试机制,本文主要是整理一下思路。
正文
假如有一个acion:
public ActionResult Index()
{
return View();
}
当然不一定是返回view(),可以是别的。
一般情况下,计算代码运行的时间可以用Stopwatch。
但是这里不能,因为:
public ActionResult Index()
{
var result = new Stopwatch();
result.Start();
return View();
result.Stop();
}
result.Stop(); 是不能运行的。
除此之外mvc的action有过滤器,个人认为过滤器也属于action的一部分,因为如果要执行一个用户请求,是会去执行里面的过滤器的,所以也需要去计算。
那么这样我们就可以在过滤器中进行计算。
先看下过滤器的执行顺序,看下关键几个:
OnActionExecuting
在action内的代码执行前执行。
OnActionExecuted
在Action 之后执行
OnResultExecuting
retrun前执行。
OnResultExecuted
retrun后执行。
真正的一个action应该是OnActionExecuting到OnResultExecuted区间的代码执行,但是他们可以分别统计出action逻辑代码和渲染代码分别执行的时间,所以分看来写是很好的。
他们都会用到stopwatch,所以可以肯定的是,一定会调用到相同的代码,所以需要封装一个方法。
public Stopwatch GetTime(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;
}
之所以用ControllerContext ,因为要区分OnAction和OnResult两次的时间计算,而ControllerContext 又贯穿整个action,有些人认为过滤器种的不是ResultExecutedContext和ActionExecutedContext这两个,
在他们上面按F12,就会发现他们继承了ControllerContext,而ControllerContext又包含了HttpContext ,所以在前端可以直接查看到时间,而不需要调试中去查看。
弊端:只是考虑了一个action的情况,如果action经过了重定向跳转到另一个action,那么计算的是一串action的时间,所以需要在OnResultExecuted中保存一个当前aciton的执行时间。
代码如下:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
GetTime(filterContext,"action").Start();
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
GetTime(filterContext, "action").Stop();
base.OnActionExecuted(filterContext);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
GetTime(filterContext, "render").Start();
base.OnResultExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var actionTimer = GetTime(filterContext, "action");
var rendertimer = GetTime(filterContext, "render");
rendertimer.Stop();
var str= String.Format("{0},{1},action{2},Result{3}", filterContext.RouteData.Values["Controller"], filterContext.RouteData.Values["action"], actionTimer.ElapsedMilliseconds.ToString(), rendertimer.ElapsedMilliseconds.ToString());
//转码
str = System.Text.Encoding.GetEncoding("GB2312").GetString( Encoding.ASCII.GetBytes(str),0,str.Length);
//向前端传递运行时间
filterContext.HttpContext.Response.Headers.Add(filterContext.RouteData.Values["Controller"] + "." + filterContext.RouteData.Values["action"],str);
base.OnResultExecuted(filterContext);
}
MVC 测试action的运行速度的更多相关文章
- ASP.NET MVC的Action拦截器(过滤器)ActionFilter
有时项目要进行客户端请求(action)进行拦截(过滤)验证等业务,可以使用拦截器进行实现,所谓的action拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.Filter ...
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...
- MVC中Action参数绑定的过程
一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二. ...
- 白话学习MVC(八)Action的执行二
一.概述 上篇博文<白话学习MVC(七)Action的执行一>介绍了ASP.NET MVC中Action的执行的简要流程,并且对TempData的运行机制进行了详细的分析,本篇来分析上一篇 ...
- 白话学习MVC(七)Action的执行一
一.概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理.对于MVC来说,请求是先 ...
- img会在特定的情况下主动的第二次调用MVC的action
当img的src为空,或者不是合法路径的时候,会连续调用MVC的action两次,第二次所传的值为src的值,这常常会导致程序报错. 这不是MVC的issue,而是浏览器的行为,当response f ...
- jquery ajax/post/get 传参数给 mvc的action
jquery ajax/post/get 传参数给 mvc的action1.ActionResult Test1 2.View Test1.aspx3.ajax page4.MetaObjec ...
- 理解ASP.NET MVC Framework Action Filters
原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ...
- [转载]jquery ajax/post/get 传参数给 mvc的action
jquery ajax/post/get 传参数给 mvc的action 1.ActionResult Test1 2.View Test1.aspx 3.ajax page 4.MetaO ...
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一. ASP.NET MVC 1.0 Result 几何? Action的 ...
随机推荐
- WireShark学习笔记(一)
1.从WireShark分析网络层协议的传输 下面是网络接口层协议,从图中可以看到两个相邻设备的MAC地址,因此该网络包才能以接力的方式传送到目的地址. 下面是网络层,在这个包中,主要的任务是把TCP ...
- [青少年CTF训练平台]web部分题解(已完结!)
文章管理系统 首先打开环境(>ω<。人)ZZz♪♪ 既然要做题,就要做全面了,图上说了,既然有假flag我就先找出来: 假flag: 打开vmware,使用sqlmap进行处理: sqlm ...
- TLSR8258方案开发之BLE协议接口代码解析
一 前言 这里的代码是在原厂基础上修改了不少.虽然代码复杂了不少,但是逻辑也清晰了不少. 二 广播协议 想要熟悉并修改ble的广播协议和内容,请查阅结构体: static const attribu ...
- day06-多表查询02
多表查询02 4.表复制 自我复制数据(蠕虫复制) 有时,为了对某个sql语句进行效率测试,我们需要海量数据时,可以用此法为表创建海量数据 -- 为了对某个sql语句进行效率测试,我们需要海量数据时, ...
- Java基础知识篇01——Java基本介绍
一.什么是 Java Java 是 Sun Microsystems 于 1995 年首次发布的一种编程语言和计算平台.编程语言还是比较好理解的,什么是计算平台呢? 计算平台是电脑中运行应用程序(软件 ...
- MyBatis Java 和 Mysql数据库 数据类型对应表
类型处理器(typeHandlers) MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Jav ...
- 从零开始写 Docker(七)---实现 mydocker commit 打包容器成镜像
本文为从零开始写 Docker 系列第七篇,实现类似 docker commit 的功能,把运行状态的容器存储成镜像保存下来. 完整代码见:https://github.com/lixd/mydock ...
- 记录--一个好用的轮子 turn.js 实现仿真翻书的效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法. 我参考官网的例子,写了一个demo ...
- 记录--三分钟打造自己专属的uni-app工具箱
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 介绍 可曾想过我们每次创建新项目,或者换地方写程序,都要把之前写过的工具类找出来又要复制粘贴一遍有些麻烦,尤其是写uni-app自定义模板 ...
- 详解SSL证书系列(7)HTTP的三大缺点
我们已经了解到HTTP协议具有相当优秀和方便的一面,然而HTTP并非只有好的一面,事物皆具有两面性,它也是有不足之处的,那么HTTP有哪些缺点呢? 窃听风险 由于HTTP本身不具备加密的功能,所以也无 ...