测量时间调用ASP.NET MVC控制器操作

时间:2012-07-05 22:00:16

标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

MVC 4应用程序的某些用户正在经历零星的缓慢。据推测,并非每个用户每次发生问题都会报告该问题。

我的想法是衡量每个控制器操作所花费的时间,并记录超过规定时间的操作调用的详细信息,以便于进一步分析(规则或排除服务器/代码问题)。

是否有方便的方法来执行此类测量,以便我可以避免为每个操作添加检测代码?我目前没有在这个项目中使用IOC,并且只是为了解决这个问题而犹豫不决。

有没有更好的方法来解决这类问题?

4 个答案:

答案 0 :(得分:38)

你能创建一个全局动作过滤器吗?像这样:

public class PerformanceTestFilter : IActionFilter
{
    private Stopwatch stopWatch = new Stopwatch();

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        stopWatch.Reset();
        stopWatch.Start();
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        stopWatch.Stop();
        var executionTime = stopWatch.ElapsedMilliseconds;
        // Do something with the executionTime
    }
}

然后将其添加到`Application_Start()'

中的GlobalFilters集合中
GlobalFilters.Filters.Add(new PerformanceTestFilter());

您可以从filterContext参数获取有关正在测试的控制器的详细信息。

<强>更新

直接将过滤器添加到GlobalFilters集合将为所有操作创建过滤器的单个实例。当然,这对于并发请求的计时不起作用。要为每个操作创建新实例,请创建过滤器提供程序:

public class PerformanceTestFilterProvider : IFilterProvider
{
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        return new[] {new Filter(new PerformanceTestFilter(), FilterScope.Global, 0)};
    }
}

然后,不要直接添加过滤器,而是在Application_Start()中添加过滤器提供程序:

FilterProviders.Providers.Add(new PerformanceTestFilterProvider());

答案 1 :(得分:4)

我通常会将这个简单的代码添加到布局视图的底部:

<!-- Page generated in @((DateTime.UtcNow - HttpContext.Current.Timestamp.ToUniversalTime()).TotalSeconds.ToString("F4")) s -->

输出类似:

<!-- Page generated in 0.4399 s -->

这开始测量创建HttpContext的时间(根据the documentation),并在写入输出之前停止,因此它应该非常准确。

它可能不适用于所有用例(如果您想测量子操作,或忽略MVC操作之外的时间等),但它很容易粘贴到视图中。

对于更高级的诊断,我曾经使用Glimpse

答案 2 :(得分:1)

尝试ASP.NET 4.5 Page Instrumentation

它检测页面呈现:您的应用程序的时间可能会花费在控制器中,但很多时候它在浏览中花费了很多时间。特别是如果你有很多部分和html助手。

答案 3 :(得分:0)

更新 - 使用Install-Package StopWatch安装我的Stopwatch NuGet包 见Profile and Time your ASP.NET MVC app all the way to Azure

查看我的教程Using Asynchronous Methods in ASP.NET MVC 4 它有一个全局动作过滤器计时器。您可以使用ELMAH记录数据。我的样本我的样本http://msdn.microsoft.com/en-us/library/gg416513(v=vs.98)也有相同的定时过滤器并且更简单,但它是剃刀前的。

查找秒表属性以启用计时。

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new UseStopwatchAttribute());
    }
}