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

Асинхронный фильтр действий в MVC 4

У меня есть фильтр действий, который при использовании в определенных конкретных условиях должен выполнять вызов веб-службы, чтобы убедиться, что текущее состояние действительно. Первоначально это казалось идеальным кандидатом для async/await, но я столкнулся с проблемой:

Предположим, что запрос:/Test/FilteredAction

  • MyCustomActionFilter начинает выполнение
    • Достигнуто первое выражение "ожидание"
  • TestController.FilteredAction начинает выполнение
  • MyCustomActionFilter возобновляет выполнение

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

Теперь я предполагаю, что это потому, что я использую:

public class MyCustomActionFilter : ActionFilterAttribute 
{
    public override **async** void OnActionExecuting(FilterContext context) 
    {
        var foo = await WebServiceCall();
    }
}

Итак, я думаю, что мой вопрос: есть ли класс фильтров действий с поддержкой асинхронного программирования, встроенный в MVC 4, или мне нужно просто блокировать вызовы здесь?

4b9b3361

Ответ 1

В MVC нет фильтра async -compatible action (но WebAPI имеет один).

В настоящее время я рекомендую использовать блокирующие вызовы в OnActionExecuting. Надеюсь, MVC будет иметь лучшую историю в будущем.

Обновление: Вы можете здесь голосовать, чтобы команда MVC добавила фильтры async.

Ответ 2

Нет, нет асинхронного фильтра для MVC, но это возможно.

Фильтры ASP.NET MVC полагаются на концепцию упорядочивания, гарантируется фильтр (если указано. См. свойство Order на IMvcFilter interface) для выполнения В определенном порядке, если указано.

Вопросы, которые необходимо решить в свете этого, следующие:

  • Для существующих фильтров, которые не являются асинхронными (по крайней мере, не реализованы таким образом, потому что другого пути нет), они получают свою собственную задачу или продолжают предыдущую? Это важный вопрос, на который нужно ответить, поскольку вам нужно взвесить преимущество того, чтобы не продолжать следующий фильтр в другом потоке или удерживать его в этом потоке, в то время как другие запросы могли его использовать.

  • Для фильтров, имеющих тот же самый порядок, выполняются ли они параллельно или один за другим? Создание метода async открывает эту возможность еще больше (хотя это могло быть сделано ранее с неасинхронной подписью) и, безусловно, это архитектурное изменение, которое может повлиять на производительность, а также на ожидаемые результаты. Ответ здесь не так прост и должен основываться на тестировании и обратной совместимости.