2015-09-22 86 views
1

我們希望在所有頁面的底部顯示來自後端服務的版本詳細信息。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或類似的事件?

+1

看來異步沒有兒童行動的支持,請參閱[這個問題](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中」 –

+0

使用'Task.Run'執行包裝無效嗎? –

+0

是的,這就是爲什麼我最初嘗試一個異步的孩子行動後,我來到這個問題。 – Tim

回答

-1

的問題就在這裏:

_versionInfoViewModelMapper.Map().Result; 

調用Task.Result,以及Task.Wait()的情況下,有一個SynchronizationContext集(這是在ASP環境真)可能會導致嚴重的死鎖。

而是使用異步版本的方法:

public async Task<ActionResult> VersionInfo() 
{ 
    var version = await _versionInfoViewModelMapper.Map(); 
    return View(version);... 
} 

欲瞭解更多信息關於這個問題看this Stephen Cleary blog post

+0

你不能有異步的孩子任務,我開始與此並得到錯誤,導致我調查其他方法。關閉這個鏈接http://stackoverflow.com/questions/29519253/awaited-async-method-not-returning-before-result-is-required – Tim

+0

是的,我只是調查了這一點。 –