2015-09-18 85 views
0

我有一個Web API控制器內部的現有方法,它從內部api返回數據。此方法目前需要大約6秒才能完成Web API異步超時

我需要調整此方法以發送多達4個請求到外部API,然後將結果保存到數據庫。

每次調用外部API需要大約2-3秒才能完成。

雖然對外部API的調用很重要,但我無法延遲用戶體驗。因此,同步調用外部API不是一個選項,因爲它可能需要每次通話3秒* 4 = 12秒,然後將必須調用內部API(5秒)= 17秒總計

爲了解決這個問題,我有做了以下修改:

使異步 在Web API方法創建一個異步調用外部API並返回任務

---前調用內部API方法 調用方法4倍的方法,將結果列表 使用Task.Delay()創建一個timeoutTask 5秒鐘;

- 調用內部API方法

遍歷任務列表 呼叫task.WhenAny(任務,timeoutTask) 如果timeoutTask完成,任務沒有完成,則其超出超時,因此停止處理。

爲了演示這個問題,我創建了一個新的ASP.NET MVC Web Api項目,並在HomeController的Index()方法中添加了相應的代碼。

我還添加了一個AsyncUnitTests.cs類,它具有與Web API方法完全相同的代碼。

奇怪的是,單元測試正常工作,並且web api調用沒有。

有沒有人有任何想法?

應用示例:WebAPIAsync.zip

+0

P.S.如果你在AsyncHelper的第16行放置了一個斷點,你會發現以下內容: - 在Web API控制器內部運行時 - task.Status == WaitingForActivation - 在單元內部運行時測試 - task.Status == RanToCompletion –

回答

0

我已經解決了! WebAPIAsyncWorking.zip

本質上 - 所有等待調用都需要通過調用.ConfigureAwait(false)方法來確保它可以在不同的上下文中繼續。

爲了將來的參考,我已經在這裏上傳了工作解決方案....