我正在实施自定义ActionFilterAttribute
,目前尚不清楚我是否需要覆盖OnActionExecutingAsync()
方法。这是一个使用ASP.NET WebAPI v5.2.3的项目。
我目前已经覆盖了OnActionExecuting()
和OnActionExecutingAsync()
,其中两个方法都调用了与过滤器实际工作相同的私有方法。
我发现两种方法都被调用 - 首先OnActionExecutingAsync()
然后 - 从调用base.OnActionExecutingAsync()
- OnActionExecuting()
调用。< / p>
所以我只需要覆盖OnActionExecuting()
吗?如果是这样,我何时需要覆盖异步版本?
答案 0 :(得分:0)
我认为您在异步控制器上尝试使用OnActionExecuting
会遇到问题,因为它无法与系统用来管理线程的CancellationToken
进行通信。您可能会发现OnActionExecuting
在await
之后恢复操作时会触发,例如,这可能是一个问题,具体取决于您的过滤器所期望的内容。
虽然基于一些实验,OnActionExecutingAsync
似乎可以与非异步控制器一起使用。
答案 1 :(得分:0)
所以我只需要覆盖OnActionExecuting()吗?如果是这样,我何时需要覆盖异步版本?
仅当您的过滤器中有长时间运行的任务时。
答案 2 :(得分:0)
通常,当一个方法有一个异步版本和一个同步版本时,它们都会调用,你应该覆盖或挂钩其中一个。对于这种情况,您可以在this链接
中查看 [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());
}
}