使用操作级别操作过滤器覆盖控制器级别操作过滤器

问题描述

我有自定义动作过滤器 DemoActionFilter ,但是我不需要为每个动作一个一个地应用此过滤器,因为如果控制器有很多动作,那将很麻烦。

我们如何添加控制器级别,但从操作级别忽略控制器级别。 例如:更高级别的授权将被AllowAnonymous

忽略
[Route("api/sample")]
[ApiController]
[TypeFilter(typeof(DemoActionFilter))]
public class SampleController : BaseController
{
  [HttpGet("one")]
  public object Sample()
  {
  }
  //I don't need to apply controller level action filter for this action
  [HttpGet("two")]
  public object Sample2()
  {}
}

public class DemoActionFilter: IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext context,ActionExecutionDelegate next)
    {
      //DO what ever
    }

}

解决方法

据我所知,没有内置方法可以忽略控制器过滤器,如AllowAnonymous属性。

如果要忽略控制器过滤器中的Sample2。您可以尝试在OnActionExecuting方法中创建if条件,如下所示:

        public void OnActionExecuting(ActionExecutingContext context)
        {

             var actionName = ((ControllerBase)context.Controller)
   .ControllerContext.ActionDescriptor.ActionName; ;

            if (actionName != "two")
            {
                //... do what you want 
            }
        }