ull*_*ark 11 c# diagnostics asp.net-mvc-3
我在ASP.NET MVC 3中构建了一个JSON服务,我希望能够测量应用程序中操作的执行时间(我希望它能够自动记录慢速操作).
因此看起来很棒; http://coderjournal.com/2010/10/timing-the-execution-time-of-your-mvc-actions/(这里有关于堆栈溢出的地方也提到了)
问题是我从这种方法得到的测量结果一定是错误的; 我添加了另一个秒表,它启动了动作的第一件事,并在返回之前停止.
例:
我相信firefox在这里有正确的时间(但它包含下载所以它有点大),但我想了解为什么属性代码不起作用,对此有什么想法?
Luk*_*tný 16
这可能不是它显示执行时间长的原因,但是当您一次有多个请求时,该属性将无法与mvc 3一起正常工作.
在以前版本的ASP.NET MVC中,除少数情况外,每个请求都会创建操作过滤器.这种行为从来都不是保证行为,而只是一个实现细节,而过滤器的合同是将它们视为无状态.在ASP.NET MVC 3中,过滤器被更积极地缓存.因此,任何不正确地存储实例状态的自定义操作过滤器都可能被破坏.
我建议将实例化新的秒表OnActionExecuting
并保存到HttpContext.Current.Items
- 然后你可以检索它OnActionExecuted
并打印出结果.
除了回答/sf/answers/407648881/之外,更正确的方法是在时钟执行结束时使用OnResultExecuted覆盖.你什么时候回来
ActionResponse.Success(arr.Select(x => func(x)).ToJson();
Run Code Online (Sandbox Code Playgroud)
即一些懒惰的LINQ语句由于你的动作,它将在动作"执行" 后计算(函数'func'执行不会计入动作执行时间).我有这个讨厌的错误,无法弄清楚为什么我的动作"执行时间"是100毫秒,虽然web请求执行10秒.修改后的代码.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace SW
{
public class StopwatchAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var stopwatch = new Stopwatch();
filterContext.HttpContext.Items["Stopwatch"] = stopwatch;
stopwatch.Start();
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
var stopwatch = (Stopwatch)filterContext.HttpContext.Items["Stopwatch"];
stopwatch.Stop();
var httpContext = filterContext.HttpContext;
var response = httpContext.Response;
response.AddHeader("X-Runtime", stopwatch.Elapsed.TotalMilliseconds.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)