【问题标题】:How to calculate all action running time in asp.net mvc5 with custom action filter?如何使用自定义操作过滤器计算 asp.net mvc5 中的所有操作运行时间?
【发布时间】:2016-07-01 07:43:59
【问题描述】:

我想在 asp.net mvc5 中记录几乎所有操作的执行时间,但基本上使用下面的代码执行此操作是正确的方法,或者它会使项目非常慢?有什么建议吗?

    Stopwatch sw = new Stopwatch();
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        sw.Start();
        base.OnActionExecuting(filterContext);
    }
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        sw.Stop();
        float f = sw.ElapsedMilliseconds;
        base.OnActionExecuted(filterContext);
    }

【问题讨论】:

  • 这对我来说看起来不错,它绝对不会让你的代码变慢。你可能有一个并发问题。我不确定是否为每个请求创建了一个单独的过滤器实例。如果没有,一旦有多个请求,您可能会得到不正确的测量结果。您可能需要将时间存储在字典中或上下文本身以避免并发问题。
  • @Jim 非常感谢您的建议,时间应该在字典中以避免并发问题。
  • 我认为它是按请求使用的,但是发生异常时会发生什么?
  • @Legends 我也有全局异常过滤器。我正在记录它。它重定向到错误页面和客户呼叫:)
  • 我的意思是,异常是否会通过 OnActionExecuted 传回,否则 sw 将一直运行直到它被释放。

标签: c# asp.net-mvc-5 stopwatch asp.net-mvc-custom-filter


【解决方案1】:

我可能会根据请求将时间存储在适当范围的位置。

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    filterContext.HttpContext.Items["timer"] = Stopwatch.StartNew();
    base.OnActionExecuting(filterContext);
}

这样您就可以避免使用繁琐的字典,并且您的计时器以per request 为基础。

然后您可以将值转换为OnActionExecuted

        var sw = filterContext.HttpContext.Items["timer"] as Stopwatch;
        sw.ElapsedMilliseconds...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2010-11-23
    • 2023-04-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    相关资源
    最近更新 更多