何时重写ActionFilterAttribute.OnActionExecutingAsync()?

时间:2016-01-14 17:53:35

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

我正在实施自定义ActionFilterAttribute,目前尚不清楚我是否需​​要覆盖OnActionExecutingAsync()方法。这是一个使用ASP.NET WebAPI v5.2.3的项目。

我目前已经覆盖了OnActionExecuting()OnActionExecutingAsync(),其中两个方法都调用了与过滤器实际工作相同的私有方法。

我发现两种方法都被调用 - 首先OnActionExecutingAsync()然后 - 从调用base.OnActionExecutingAsync() - OnActionExecuting()调用。< / p>

所以我只需要覆盖OnActionExecuting()吗?如果是这样,我何时需要覆盖异步版本?

3 个答案:

答案 0 :(得分:0)

我认为您在异步控制器上尝试使用OnActionExecuting会遇到问题,因为它无法与系统用来管理线程的CancellationToken进行通信。您可能会发现OnActionExecutingawait之后恢复操作时会触发,例如,这可能是一个问题,具体取决于您的过滤器所期望的内容。

虽然基于一些实验,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());
        }
    }