Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测量ASP.NET MVC 3的性能_C#_Asp.net Mvc 3_Diagnostics - Fatal编程技术网

C# 测量ASP.NET MVC 3的性能

C# 测量ASP.NET MVC 3的性能,c#,asp.net-mvc-3,diagnostics,C#,Asp.net Mvc 3,Diagnostics,我已经在ASP.NET MVC 3中构建了一个JSON服务,我希望能够测量我的应用程序中动作的执行时间(我希望它能够自动记录慢动作) 因此这看起来很棒;(这里的堆栈溢出部分也提到了这一点) 问题是我用这种方法得到的测量结果肯定是错误的; 我添加了另一个秒表,它启动动作中的第一件事情,并在返回之前停止 例如: 方法内部的秒表=>10ms(这里省略了json序列化,因此我可以理解它比实际时间短) 秒表属性(上面的代码)=>676ms Firefox表示请求耗时=>70毫秒 我相信firefox在

我已经在ASP.NET MVC 3中构建了一个JSON服务,我希望能够测量我的应用程序中动作的执行时间(我希望它能够自动记录慢动作)

因此这看起来很棒;(这里的堆栈溢出部分也提到了这一点)

问题是我用这种方法得到的测量结果肯定是错误的; 我添加了另一个秒表,它启动动作中的第一件事情,并在返回之前停止

例如:

  • 方法内部的秒表=>10ms(这里省略了json序列化,因此我可以理解它比实际时间短)
  • 秒表属性(上面的代码)=>676ms
  • Firefox表示请求耗时=>70毫秒

我相信firefox在这里的时间是正确的(但它包含了下载,所以有点大),但我想了解为什么属性代码不起作用,有什么想法吗?

为什么不从Rhino commons看一下呢?

看起来你已经偏离了一个数量级。您确定正确读取了结果吗?请尝试使用该属性。

这可能不是它显示执行时间长的原因,但当您同时有多个请求时,该属性无法在mvc 3中正常工作

在ASP.NET MVC的早期版本中, 根据请求创建操作筛选器 除了少数情况。这种行为 从来都不是一种保证的行为,而是 仅仅是一个实现细节和 过滤器的合同已签订 认为它们是无状态的。在ASP.NET中 MVC 3,过滤器被缓存得更多 积极地。因此,任何习俗 不正确存储的操作筛选器 实例状态可能已损坏


我建议在
OnActionExecuting
中实例化新秒表,然后您可以在
OnActionExecuted
中检索它并打印结果。

除了答案之外,更正确的方法是在时钟执行结束时使用OnResultExecuted覆盖。 当你回来的时候

ActionResponse.Success(arr.Select(x => func(x)).ToJson();
i、 e.某些延迟LINQ语句作为您操作的结果,将在“执行”操作后计算(函数“func”的执行不会计入操作执行时间)。 我有一个讨厌的bug,我不明白为什么我的动作“执行时间”是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());
        }
    }
}

是的,Firefox中的缓存关闭了…你是对的,因为动作是缓存的,构造函数只是偶尔运行一次,所以相同的秒表被重用。有问题的代码现在按照LukášNovotný的建议工作。这不会返回可靠的结果,因为之后呈现的视图可能会调用ChildActionsErmagherd,这太棒了。您知道是否可以将其与
ActionFilterAttribute
分开,以便用于任何方法?我想我应该为属性设置一个name属性来跟踪各种秒表或记录一个秒表,并在EndRequest时终止它,但我不知道如何抓取“OnResultExecuted”事件来执行非操作。如果你想在网页中有一个“debug”控制台,这非常好