何时覆盖 ActionFilterAttribute.OnActionExecutingAsync()
本文关键字:OnActionExecutingAsync ActionFilterAttribute 覆盖 何时 | 更新日期: 2023-09-27 18:30:35
我正在实现一个自定义ActionFilterAttribute
,目前尚不清楚我是否需要覆盖OnActionExecutingAsync()
方法。这是一个使用 ASP.NET WebAPI v5.2.3 的项目。
我目前已经覆盖了OnActionExecuting()
和OnActionExecutingAsync()
,其中两种方法都调用执行过滤器实际工作的同一私有方法。
我发现这两个方法都被调用 - 首先OnActionExecutingAsync()
然后 - 从调用base.OnActionExecutingAsync()
- OnActionExecuting()
被调用。
那么我只需要覆盖OnActionExecuting()
吗?如果是这样,我什么时候需要覆盖异步版本?
我认为您在尝试在异步控制器上使用OnActionExecuting
时会遇到问题,因为它无法传达系统用于管理线程的CancellationToken
。您可能会发现OnActionExecuting
在await
后恢复操作时触发,这可能是一个问题,具体取决于您的过滤器预期的内容。
不过,根据一些实验,OnActionExecutingAsync
似乎适用于非异步控制器。
那么我只需要覆盖 OnActionExecuting() 吗?如果是这样,我什么时候需要覆盖异步版本?
仅当筛选器中有一个长时间运行的任务时。
通常,当一个方法具有异步版本和同步版本时,它们都会调用,您应该覆盖或挂钩到其中一个。对于这种情况,您可以在此链接中检查它
[NonAction]
public virtual async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (next == null)
{
throw new ArgumentNullException(nameof(next));
}
OnActionExecuting(context);
if (context.Result == null)
{
OnActionExecuted(await next());
}
}