Вызов асинхронных методов в фильтрах действий в MVC 5

Я пишу фильтр действий (наследование от ActionFilterAttribute), которая использует HttpClient для отправки данных на внешний сервер в OnResultExecuted метод. HttpClient имеет способ PostAsync который возвращает ожидаемый объект Task<HttpResponseMessage>.

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    using (var client = new HttpClient())
    {
        var task = client.PostAsync(GetUri(), GetContent());
        var result = task.Result; // blocking
    }
}

принятый ответ на асинхронный фильтр действий в MVC 4 говорит, что это невозможно в MVC 4.

это все еще верно в MVC 5, и если да, то каков наилучший способ вызова этого асинхронного метода без блокировки нить?

2 ответов


Да, это все еще правда. Web API 2 поддерживает фильтры асинхронных действий, а MVC 5-нет. Я просто был лично разочарован этим не так давно. В настоящее время вам нужно будет либо запустить асинхронный метод как синхронизацию внутри фильтра действий, либо повторить асинхронный код, который у вас был бы в фильтре действий внутри каждого действия, которое требует его, которое вы затем can запуск асинхронного.


какой-то парень вроде "обратно портировал" его здесь

https://github.com/jdaigle/Hydrogen.Extensions.Mvc5

Я не пробовал и не могу рекомендовать его, но если вы переходите на .NET Core, возможно, стоит рассмотреть. К счастью, мне удалось удалить весь асинхронный код из моего расширения - на этот раз.