Мы хотим отображать сведения о версии из наших серверных служб внизу всех страниц.
3 бэкэнд-сервиса — это асинхронные вызовы webapi(2.2), нам нужно, чтобы эти 3 асинхронных вызова объединяли дату в модель, а затем передавали ее в представление.
Если я делаю это как часть действия контроллера (не дочернего), код работает и отображает данные.
Однако попытка отобразить эти данные внизу каждой страницы (дочернее действие) приводит к нескольким различным условиям типа асинхронной взаимоблокировки.
дочернее действие и вызов _layout.cshtml
//ControllerAction
[ChildActionOnly]
public ActionResult VersionInfo()
{
var version = _versionInfoViewModelMapper.Map().Result;
return View(version);...
}
//Layout.cshtml
@if(Request.IsAuthenticated)
{
Html.RenderAction("VersionInfo", "Utils");
}
Это приводит к тому, что кажется тупиком, поскольку запрос не заканчивается,
использование ActionFilter
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
var viewBag = filterContext.Controller.ViewBag;
if (filterContext.RequestContext.HttpContext.Request.IsAuthenticated)
{
//viewBag.VersionInfo = Task.Run(() => _versionInfoViewModelMapper.Map()).Result;
viewBag.VersionInfo = _versionInfoViewModelMapper.Map().Result;
}
}
использование вышеуказанного фильтра для передачи данных в ViewBag, который затем используется, дает тот же бесконечный вызов.
Если я не использую .Result для асинхронных вызовов, я получаю сообщение об ошибке
HttpServerUtility.Execute заблокирован во время ожидания завершения асинхронной операции.
Есть ли способ обойти эту проблему? потенциально с помощью Global.asax Application_PostAuthenticateRequest или аналогичного события?
Task.Run
не работает? - person Kędrzu   schedule 22.09.2015