【问题标题】:It's possible to ignore a ServiceFilter controller for one action only?是否可以仅针对一项操作忽略 ServiceFilter 控制器?
【发布时间】:2020-06-03 21:00:16
【问题描述】:

是否可以仅针对一个操作忽略 ServiceFilter 控制器并应用另一个 servicefilter?在我的情况下,对于“MethodTwo”操作

[Route("api/test")]
[ServiceFilter(typeof(RequireFilter1))]
public class TestController : BaseApiController
{
  public ActionResult MethodOne()
  {
    //Code
  }

  [ServiceFilter(typeof(RequireFilter2))]
  public ActionResult MethodTwo(int id)
  {
     //Code
  }
}

【问题讨论】:

    标签: c# visual-studio asp.net-core asp.net-web-api


    【解决方案1】:

    你好

    对于您的情况,两个过滤器都将在 MethodTwo 中执行。

    您可以在此处阅读有关过滤器执行顺序的更多信息 - Filters in ASP.NET Core - MSDN

    因此,对于您的情况,您可以分析 RequireFilter1 中的现有操作属性,如果将任何其他 ServiceFilterAttribute 分配给操作,请不要执行它。 或者你可以创建你的属性来阻止控制器属性。

    例如(如果 ServiceFilterAttribute 附加到操作,则禁用控制器过滤器执行):

    public void OnActionExecuting(ActionExecutingContext context)
        {
            var actDescr = (context.ActionDescriptor as ControllerActionDescriptor);
            if (actDescr!=null)
            {
                var attrs = actDescr.MethodInfo.GetCustomAttributes(typeof(ServiceFilterAttribute),true);
                if (attrs.Any())
                    return;
            }
            context.HttpContext.Response.Headers.Add("ActionFilterExample1",
                                                 new string[] { "test ActionFilterExample1", "test ActionFilterExample0" });
        }
    

    此外,您必须对过滤器的 OnActionExecuted 执行相同操作。

    另一种方法 - 为禁用控制器属性创建单独的属性:

    public class DisableAttr : Attribute  
    {
    
    }
    

    并在 OnActionExecuting 中检查:

    actDescr.MethodInfo.GetCustomAttributes(typeof(DisableAttr),true);
    

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2019-07-09
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多