.net core 使用操作级操作筛选器覆盖控制器级操作筛选器

.net core 使用操作级操作筛选器覆盖控制器级操作筛选器,.net-core,filter,overriding,asp.net-core-webapi,action,.net Core,Filter,Overriding,Asp.net Core Webapi,Action,我有自定义动作过滤器DemoActionFilter,但我不需要对每个动作逐一应用此过滤器,因为如果控制器有很多动作,那么它将是一个混乱的过程 我们如何添加控制器级别,但从操作级别忽略控制器级别。 例如:更高级别的授权将以AllowAnonymous忽略 [Route("api/sample")] [ApiController] [TypeFilter(typeof(DemoActionFilter))] public class SampleController : Bas

我有自定义动作过滤器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 
            }
        }

张:是的,我也明白,你是一个没有内置的方法。我也遵循了你提到的逻辑。无论如何,谢谢。