如何使用 ActionFilterAttribute 记录运行时间?

2023-11-22

我创建了一个操作过滤器,用于测量 Web API v2 中每个操作的运行时间。

public class RunningTimeAttribute : ActionFilterAttribute
    {
        private readonly ILogFactory _logFactory;
        private readonly ITimerFactory _timerFactory;
        private ITimer _timer;
        private ILogger _logger;

        public RunningTimeAttribute(ILogFactory logFactory, ITimerFactory timerFactory) {
            if(logFactory == null)
                throw new ArgumentNullException("logFactory");
            if(timerFactory == null)
                throw new ArgumentNullException("timerFactory");

            _logFactory = logFactory;
            _timerFactory = timerFactory;
        }

        public override void OnActionExecuting(HttpActionContext actionContext) {
            base.OnActionExecuting(actionContext);
            OnBeforeAction(actionContext);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) {
            OnAfterAction(actionExecutedContext);
            base.OnActionExecuted(actionExecutedContext);
        }

        private void OnBeforeAction(HttpActionContext actionContext) {
            var controllerName = actionContext.ControllerContext.Controller.GetType().FullName;
            var actionName = actionContext.ActionDescriptor.ActionName;

            _logger = _logFactory.Create(controllerName);
            _logger.Trace("Action \"{0}\" begins execution", actionName);

            _timer = _timerFactory.Create();
            _timer.Start();
        }

        private void OnAfterAction(HttpActionExecutedContext actionExecutedContext) {
            var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;

            _timer.Stop();
            _logger.Trace("Time elapsed for action \"{0}\": {1} msec", actionName, _timer.ElapsedMilliseconds);
        }

}

然而,动作过滤器充当单例,所以当OnActionExecuted运行,我不能确定_logger and _timer对应于为同样的动作OnActionExecuting.

Eg.

  1. 动作 Foo1 开始执行。_logger = "logger1", _timer = "timer1".
  2. 动作 Foo2 开始执行。_logger = "logger2", _timer = "timer2"(他们被覆盖)
  3. 动作 Foo1 结束执行。它停止计时器并记录经过的时间,这是无意义的(end1-start2)。

Question: 有什么办法可以知道吗OnActionExecuted到哪个OnActionExecuting它对应?如果操作有一些唯一标识符,我可以将其用作字典的键来存储任何与操作相关的对象,例如记录器和计时器。有没有?或者其他解决方案?


就 Web API 而言System.Web.HttpContext.Current并不总是有保证。这取决于您是否使用 Web API 自托管。这是覆盖时的主要原因System.Web.Http.Filters.ActionFilterAttribute.OnActionExecuting您没有获得 httpcontext 属性HttpActionContext参数(在 AspNet MVC 中你可以这样做)。

做同样的事情的最好方法是actionContext.Request.Properties字典。

另请检查这个答案here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ActionFilterAttribute 记录运行时间? 的相关文章

  • "/>

    Error 5 expected Css test css gt gt 我需要给吗 在这里 因为我的解决方案仍然无法正常工作 它开始给出一些其他错误 您需要添加一个等号 如下所示 Css test css gt gt 解释 块将整个语句或块
  • 关于我的编译器中缺少 stdafx.h(Windows 上的 mingw32)

    我有一个简单的问题 我注意到我的编译器中没有 stdafx h Windows 上的 mingw32 我应该拥有它吗 或者也许有办法绕过它 谢谢阅读 编辑 好的 这是我取出 stdafx h 的所有包含内容后的当前构建日志 http pas
  • 使用MVVM Light的Messenger在视图模型之间传递值

    有人可以帮我解释一下 MVVM Light 的 Messenger 吗 我正在阅读 StackOverflow 上的一篇文章 MVVM 在视图模型之间传递值 https stackoverflow com questions 6392854
  • VS 2012 中缺少实体数据模型

    添加新项目时 我在 数据 选项卡下找不到实体数据模型 我查看了几个问题和答案以及有关此问题的信息 但没有一个解决方案有效 我已修复 卸载并重新安装 手动安装 EF Tools 包并尝试卸载所有 VS 相关程序 我还尝试在不同的 NET 框架
  • 字节序和大小为 1 的位域

    我认为字节顺序不应该影响大小最多为 1 个字节的结构 但这是我的小端机器上的代码 include
  • 哪种本机 dotNet 数据类型最适合传递 SQL Server HierarchyId 值?

    具体来说 我们有一个接受 HierarchyId 作为参数的 SQL Server 存储过程 并且通常我们的存储过程上有一个 SOAP 层 允许通过 SOAP 调用它们 SOAP 服务是使用 C 方法上的 WebMethod 属性来实现的
  • “char *”类型的参数与“LPWSTR”类型的参数不兼容

    以前可能有人问过这个问题 但我似乎找不到解决方案 std string GetPath char buffer MAX PATH GetSystemDirectory buffer MAX PATH strcat buffer versio
  • iTextSharp 从一页模板高效批量生成 PDF

    我正在使用 ITextSharp 生成多页 PDF 每个页面都有相同的模板 问题是 PDF 的物理大小会随着模板的大小而增长 I HAVE to use 阿克罗菲尔德 我怎么能够reduce最终文件大小 这是 pdf 处理程序的代码片段 p
  • 无法使用Boost.process

    我下载并打包了 1 54 0 版本的 Boost 库 我做了类似回答这个问题的一切 如何在 Visual Studio 2010 中使用 Boost https stackoverflow com questions 2629421 how
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 关于使用 Botframework v4 更改为新 LUIS 密钥的问题

    我在 Azure 中下载了 C 模板 它会自动创建并设置 LUIS 应用程序 但现在 LUIS 达到 1000 次调用并且现已过期 我使用创建了一个新密钥本指南 https learn microsoft com en us azure c
  • 你把你的验证放在 asp.net mvc 3 的哪里?

    ASP NET MVC 中一种常见的推荐做法是您不应该将您的商业模式发送到您的视图中 http lostechies com jimmybogard 2009 06 30 how we do mvc view models 相反 您应该创建
  • 在 C# 中创建我的对称密钥

    一直在审查一些对称加密方法 我看到了很多在类中硬编码私有静态变量的示例 通常类似于 string key THISISYOURENCRYPTIONKEY 然后在更远的地方 代码使用它来加密 解密 抛开正确的实现 算法 策略以及存储它的位置
  • static_assert 有什么作用,你会用它做什么?

    你能举个例子吗static assert C 11 会优雅地解决手头的问题吗 我熟悉运行时assert 我应该选择什么时候static assert 超过常规assert 另外 在boost有一种东西叫做BOOST STATIC ASSER
  • 在第 i 个位置切换一点[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中设置 清除和切换单个位 https stackoverflow com questions 47981 how do you set clear and toggle a single
  • 使用boost asio的线程池

    我正在尝试使用 boost asio 创建一个有限的线程池类 但我陷入了困境 有人可以帮助我吗 唯一的问题是我应该减少计数器的地方 代码无法按预期工作 问题是我不知道我的线程何时完成执行以及我如何知道它已返回池 include
  • C# 以非管理员权限运行进程

    我启动了一个有关管理员权限的流程 psi Verb runas process StartInfo psi process Start 但现在这个过程必须启动另一个应用程序 但需要非管理员权限 应用程序适用于非管理员权限 我怎样才能做到这一
  • 单击用户控件时如何防止窃取焦点? [复制]

    这个问题在这里已经有答案了 我希望能够单击我的用户控件 而不让它从任何其他控件中窃取焦点 我知道当你点击标签时它不会夺走焦点 如何才能做到这一点 尝试禁用您的控件ControlStyles Selectable http msdn micr
  • 为什么编译器将“char”匹配“int”而不是“short”?

    我有一个小程序 include

随机推荐