ActionFilterAttribute:何时使用 OnActionExecuting 与 OnActionExecutingAsync?

Posted

技术标签:

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

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

更新

代码如下:

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 即可记录请求。 这就是我所在的位置。在调用堆栈上暂停之前,我看了一个小时左右——但我没有深入研究源代码或任何东西;-)。 【参考方案1】:

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

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

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

【讨论】:

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

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

【讨论】:

如果总是调用OnActionExecuting,那么async方法有什么用? @Pliskin,这是一个很好的问题,但我没有答案。也许值得另一个 SO 问题。 两个都需要实现吗? 根据我的经验...没有。

以上是关于ActionFilterAttribute:何时使用 OnActionExecuting 与 OnActionExecutingAsync?的主要内容,如果未能解决你的问题,请参考以下文章

POST JSON 到 ActionFilterAttribute

在ActionFilterAttribute上的OnActionExecutedAsync中等待

是否为每个操作实例化了 ActionFilterAttribute?

MVC之 自定义过滤器(ActionFilterAttribute)

使用自定义 ActionFilterAttribute 在 MVC 5 中注销用户

ASP.NET MVC ActionFilterAttribute用法