Переопределить определенный фильтр действий

В моем приложении WebApi 2 у меня есть атрибут фильтра действий в моем базовом контроллере, этот атрибут имеет логическое свойство со значением по умолчанию, которое можно установить в конструкторе:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
  public bool MyProperty {get; set;}

  public MyActionFilterAttribute(bool myProperty = true)
  {
    MyProperty = myProperty;
  }

  public override void OnActionExecuting(HttpActionContext actionContext)
  {
    if(MyProperty)
    {
        //DO Something
    }
  }
}

Я также настроил CustomValidatorFilter в конфигурации webApi:

config.Filters.Add(new CustomValidatorFilterAttribute());

В некоторых действиях моего контроллера я хочу переопределить поведение MyActionFilterAttribute, установив значение MyProperty в false, я добавил OverrideActionFilters в свое действие:

[OverrideActionFilters]
[MyActionFilterAttribute(myProperty: false)]
public IHttpActionResult MyCation()
{
  //Some staff here
}

Но теперь моя пользовательская проверка больше не работает из-за использования OverrideActionFilters. Есть ли способ переопределить OverrideActionFilters или просто указать фильтр для переопределения. Спасибо за помощь.


person Bilel Chaouadi    schedule 12.12.2018    source источник
comment
Не могли бы вы уточнить, как это соответствует названию вопроса?   -  person nemanja228    schedule 12.12.2018
comment
Извините, я забыл обновить заголовок   -  person Bilel Chaouadi    schedule 12.12.2018
comment
Ну, во-первых, фильтры авторизации не должны быть фильтрами действий. Вот почему существуют IAuthorizationFilter. Они запускаются в другой момент жизненного цикла (до фильтров действий), и им также передается AuthorizationContext, которого нет у ActionFilters. Вы можете легко создать механизм, заставляющий фильтр ничего не делать, если установлено определенное значение.   -  person Erik Funkenbusch    schedule 12.12.2018
comment
Предположим, что это не атрибут авторизации, а простой фильтр, я обновил вопрос   -  person Bilel Chaouadi    schedule 12.12.2018


Ответы (1)


Я создал определенный атрибут DoMyPropertyAttribute, а затем удалил свойство из MyActionFilterAttribute. В MyActionFilterAttribute я проверяю, есть ли у действия `DoMyPropertyAttribute, и если да, то я выполняю конкретную работу:

public class DoMyPropertyAttribute : Attribute
{
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(HttpActionContext actionContext)
  {
    if(actionContext.ActionDescriptor.GetCustomAttributes<DoMyPropertyAttribute>().Any())
    {
        //DO Something
    }
  }
}

В общем, если мы хотим переопределить фильтр действий, нам нужно просто пропустить его, а затем создать определенный фильтр действий, соответствующий желаемому поведению. Чтобы пропустить фильтр действий, мы можем сделать:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(HttpActionContext actionContext)
  {
    if(actionContext.ActionDescriptor.GetCustomAttributes<SkipMyActionFilterAttribute>().Any())
     {
       return;
     }

    //Do something
  }
}
person Bilel Chaouadi    schedule 13.12.2018