Подтвердить что ты не робот

OnActionExecuted вызывается дважды в Web API

Я пытаюсь сделать некоторые вещи после того, как мой контроллер будет выполнен с действием OnActionExecuted. Однако метод вызывается дважды.

Мой метод фильтрации

public class TestFilter: ActionFilterAttribute
{
  public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {

       //do stuff here


    }
}

и мой контроллер

[TestFilter]
  public class BaseController : ApiController
{
 public LoginResponseDTO Login(LoginRequestDTO loginRequestDTO)
    {

 //do login stuff
    }

}

когда я пытаюсь использовать этот фильтр, метод onActionExecuted вызывается дважды, что заставляет мое действие в методе применяться дважды к ответу. Я искал причину, но не могу найти решение.

Любые идеи?

4b9b3361

Ответ 1

Ответ от комментариев @Martijn выше:

 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
 public class TestFilter: ActionFilterAttribute

Все кредиты идут ему. (Примечание: я удалю сообщение, если он решит добавить комментарий как ответ)

Ответ 3

Для меня проблема заключалась в том, что я вызывал /myApi/action, который перенаправлялся на /myApi/action/, и это вызывало OnActionExecuted() для запуска дважды.

Я отфильтровал, где filterContext.Result является RedirectResult внутри OnActionExecuted, так как тогда меня не интересовал запуск моего кода. Код состояния HTTP показывался как 200 на обоих вызовах, поэтому фильтрация по ним не будет работать.

Ответ 4

Вы можете переопределить AllowMultiple внутри вашего ActionFilterAttribute, например так:

public override bool AllowMultiple { get { return false; } }

public override void OnActionExecuting(HttpActionContext actionContext)
{
  //Your logic
}

Это остановит ваш ActionFilter, вызываемый дважды. Также убедитесь, что он не зарегистрирован дважды. Посмотрите этот ответ на fooobar.com/info/609434/... чтобы узнать больше об этом.

Имейте в виду, что атрибут AttributeUsage является одноразовым атрибутом - его нельзя применять более одного раза к одному и тому же классу, как вы найдете в разделе " Примечания".