我們希望在所有頁面的底部顯示來自後端服務的版本詳細信息。MVC應用程序中的異步調用死鎖
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然後使用d,給出了同樣的無盡的呼叫。
如果我不上的異步調用使用。結果我得到在等待異步 操作完成阻止錯誤
HttpServerUtility.Execute。
有沒有辦法解決這個問題?可能通過使用Global.asax Application_PostAuthenticateRequest或類似的事件?
看來異步沒有兒童行動的支持,請參閱[這個問題](HTTP:// stackoverflow.com/questions/12739114/asp-net-mvc-4-async-child-action)或[this other question](http://stackoverflow.com/questions/28680288/mvc-async-child-actions-not - 工作 - 在-IIS)。 [codeplex]中的請求(http://aspnetwebstack.codeplex.com/workitem/601)被關閉爲「作爲View Component的一部分添加到MVC 6中」 –
使用'Task.Run'執行包裝無效嗎? –
是的,這就是爲什麼我最初嘗試一個異步的孩子行動後,我來到這個問題。 – Tim