gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:10:43 26 4
gpt4 key购买 nike

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

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);
}

}

但是, Action 过滤器充当单例,所以当 OnActionExecuted 运行时,我无法确定 _logger_timer 是否对应为相同的操作 OnActionExecuting 创建。

例如。

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

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

最佳答案

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

最好的方法是使用 actionContext.Request.Properties 字典。

同时检查这个答案 here

关于c# - 如何使用 ActionFilterAttribute 记录运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22535921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com