Вызов асинхронных методов в фильтрах действий в 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, возможно, стоит рассмотреть. К счастью, мне удалось удалить весь асинхронный код из моего расширения - на этот раз.