前言

网络很多文章有关于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的运行速度的更多相关文章

  1. ASP.NET MVC的Action拦截器(过滤器)ActionFilter

    有时项目要进行客户端请求(action)进行拦截(过滤)验证等业务,可以使用拦截器进行实现,所谓的action拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.Filter ...

  2. 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test

    原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...

  3. MVC中Action参数绑定的过程

    一.题外话 上一篇:MVC中Action的执行过程 ControllerContext 封装有了与指定的 RouteBase 和 ControllerBase 实例匹配的 HTTP 请求的信息. 二. ...

  4. 白话学习MVC(八)Action的执行二

    一.概述 上篇博文<白话学习MVC(七)Action的执行一>介绍了ASP.NET MVC中Action的执行的简要流程,并且对TempData的运行机制进行了详细的分析,本篇来分析上一篇 ...

  5. 白话学习MVC(七)Action的执行一

    一.概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理.对于MVC来说,请求是先 ...

  6. img会在特定的情况下主动的第二次调用MVC的action

    当img的src为空,或者不是合法路径的时候,会连续调用MVC的action两次,第二次所传的值为src的值,这常常会导致程序报错. 这不是MVC的issue,而是浏览器的行为,当response f ...

  7. jquery ajax/post/get 传参数给 mvc的action

    jquery ajax/post/get 传参数给 mvc的action1.ActionResult Test1    2.View  Test1.aspx3.ajax page4.MetaObjec ...

  8. 理解ASP.NET MVC Framework Action Filters

    原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ...

  9. [转载]jquery ajax/post/get 传参数给 mvc的action

    jquery ajax/post/get 传参数给 mvc的action 1.ActionResult Test1     2.View  Test1.aspx 3.ajax page 4.MetaO ...

  10. ASP.NET MVC – 关于Action返回结果类型的事儿(上)

    原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一.         ASP.NET MVC 1.0 Result 几何? Action的 ...

随机推荐

  1. 并发编程 --- CAS原子操作

    介绍 CAS(Compare And Swap) 是一种无锁算法的实现手段,中文名称为比较并交换.它由 CPU 的原子指令实现,可以在多线程环境下实现无锁的数据结构. 原理 CAS 的原理是:它会先比 ...

  2. RC4算法:流密码算法的经典之作

    一.RC4算法的起源与演变 RC4算法是由著名密码学家Ron Rivest在1987年设计的一种流密码算法,其名字来源于Rivest Cipher 4.RC4算法简单高效,被广泛应用于数据加密和网络安 ...

  3. typora 目录内添加右键

    Typora.reg 这里路径改成自己的 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\sh ...

  4. Android MaterialButtonToggleGroup使用

    原文地址: Android MaterialButtonToggleGroup使用 - Stars-One的杂货小窝 觉得单选框不好看,发现了一个Material里的单选按钮组,感觉UI还不错,记下使 ...

  5. 修改easyui日期控件只显示年月,并且只能选择年月

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. OSI七层协议和TCP/IP五层协议

      OSI七层模型概略: OSI 中的层 功能 TCP/IP协议族 应用层 文件传输,电子邮件,文件服务,虚拟终端 HTTP,SMTP,FTP,DNS 表示层 数据压缩,解压,数据加密 无 会话层 解 ...

  7. CentOS 同时安装多个版本的Python3

    1.背景 已安装了 Python3.6.4,需要再安装 Python3.9 版本 2.操作步骤 (1)寻找当前 Python3.9 版本最新稳定版的子版本 通过官网查找,目前为 3.9.18,下载到本 ...

  8. 三维模型3DTile格式轻量化压缩处理重难点分析

    三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决.以下是几个主要的重难点: 1.压缩率和模型质量之间的平衡: ...

  9. 你是怎么理解ES6中 Generator的?使用场景?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段: 回 ...

  10. 记录--Event Loop事件循环、微任务、宏任务

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 JS是一门单线程语言,单线程就意味着,所有的任务需要排队,前一个任务结束,才会执行下一个任务.这样所导致的问题是:如果JS执行的时间 ...