【问题标题】:ActionFilterAttribute: When to use OnActionExecuting vs. OnActionExecutingAsync?ActionFilterAttribute:何时使用 OnActionExecuting 与 OnActionExecutingAsync?
【发布时间】:2016-05-03 16:01:15
【问题描述】:

我创建了一个从System.Web.Http.Filters.ActionFilterAttribute 继承的LoggedAttribute 类,并将登录放入OnActionExecuting 和OnActionExecutingAsync 方法;我曾假设一个用于异步调用,一个用于非异步调用,但似乎两者都在使用。那么我应该登录哪个呢?

更新

代码如下:

public sealed class LoggedAttribute : ActionFilterAttribute
{
    private readonly ILog _logger;

    public LoggedAttribute(ILogManager logManager)
    {
        _logger = logManager.GetLogger<LoggedAttribute>();
    }

    public LoggedAttribute() : this(new LogManager()) {}

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //logging logic goes here
        base.OnActionExecuting(actionContext);
    }

    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        //logging logic goes here
        await base.OnActionExecutingAsync(actionContext, cancellationToken);
    }
}

然后,我将 [Logged] 属性应用到我的基本 ApiController,我得到了单个调用的重复日志条目。

【问题讨论】:

  • 您是否将过滤器应用于同步和异步操作,请提供代码
  • 如果异步操作被取消,是否要记录?调用树是 OAEAsync->OAE...
  • 我真的不在乎它是否被取消;我只想记录请求和相关的元数据。
  • @bri,如果我理解正确的话,我只需要将逻辑放入OnActionExecuting 即可记录请求。
  • 这就是我所在的位置。在调用堆栈上暂停之前,我看了一个小时左右——但我没有深入研究源代码或任何东西;-)。

标签: c# asp.net-web-api async-await


【解决方案1】:

回复没有回答我认为的问题,

如果您需要在执行操作之前运行代码,则可以使用两者。

如果您还希望它同步运行,请使用OnActionExecuting,否则使用OnActionExecutingAsync(例如异步)。

【讨论】:

  • 两个都需要实现吗?
  • @deadManN 不,你没有。
  • 我只提供异步版本......但看起来同步版本是假的,并且为了覆盖提议......
【解决方案2】:

好吧,看起来 OnActionExecuting 在每个请求上都会被调用。我将我的逻辑完全放在该方法中,它似乎可以按预期工作。

【讨论】:

  • 如果总是调用OnActionExecuting,那么async方法有什么用?
  • @Pliskin,这是一个很好的问题,但我没有答案。也许值得另一个 SO 问题。
  • 两个都需要实现吗?
  • 根据我的经验...没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
相关资源
最近更新 更多