何时覆盖 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()吗?如果是这样,我什么时候需要覆盖异步版本?

何时覆盖 ActionFilterAttribute.OnActionExecutingAsync()

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

不过,根据一些实验,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());
        }
    }
相关文章:
  • 没有找到相关文章