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