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
类,并将登录放入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
即可记录请求。
这就是我所在的位置。在调用堆栈上暂停之前,我看了一个小时左右——但我没有深入研究源代码或任何东西;-)。
【参考方案1】:
回复没有回答我认为的问题,
如果您需要在执行操作之前运行代码,则可以使用两者。
如果您还希望它同步运行,请使用OnActionExecuting
,否则使用OnActionExecutingAsync
(例如异步)。
【讨论】:
两个都需要实现吗? @deadManN 不,你没有。 我只提供异步版本......但看起来同步版本是假的,并且为了覆盖提议......【参考方案2】:好吧,看起来 OnActionExecuting 在每个请求上都会被调用。我将我的逻辑完全放在该方法中,它似乎可以按预期工作。
【讨论】:
如果总是调用OnActionExecuting,那么async方法有什么用? @Pliskin,这是一个很好的问题,但我没有答案。也许值得另一个 SO 问题。 两个都需要实现吗? 根据我的经验...没有。以上是关于ActionFilterAttribute:何时使用 OnActionExecuting 与 OnActionExecutingAsync?的主要内容,如果未能解决你的问题,请参考以下文章
POST JSON 到 ActionFilterAttribute
在ActionFilterAttribute上的OnActionExecutedAsync中等待
是否为每个操作实例化了 ActionFilterAttribute?
MVC之 自定义过滤器(ActionFilterAttribute)