Можно ли игнорировать контроллер ServiceFilter только для одного действия? - PullRequest
0 голосов
/ 19 февраля 2020

Можно ли игнорировать контроллер 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
  }
}

1 Ответ

1 голос
/ 19 февраля 2020

Привет .

Для вашего случая оба метода будут выполнены в MethodTwo.

Здесь вы можете узнать больше о последовательности выполнения фильтров - Фильтры в ASP. NET Core - MSDN Таким образом, для вашего случая вы можете проанализировать существующие атрибуты действия в RequireFilter1 и не выполнять его в случае, если какой-либо другой ServiceFilterAttribute назначен действию. Или вы можете создать свой атрибут, который будет блокировать атрибут Controller.

Например (отключить выполнение фильтра контроллера, если 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);
...