Web API异步超时
本文关键字:超时 异步 API Web | 更新日期: 2023-09-27 18:13:31
我有一个Web API控制器内部的现有方法,它从内部API返回数据。这个方法目前大约需要6秒来完成
我需要适应这种方法发送多达4个请求到外部API,然后将结果保存到数据库。
每次对外部API的调用大约需要2-3秒才能完成。
虽然对外部API的调用很重要,但我不能延迟用户体验。因此,同步调用外部api不是一个选项,因为每次调用可能需要3秒* 4 = 12秒,然后将不得不调用内部api(5秒)= 17秒总计
为了解决这个问题,我做了以下更改:
使Web API方法异步创建一个异步调用外部api并返回任务的方法
——在调用内部API方法之前调用该方法4次,将结果添加到List中使用Task.Delay()创建一个5秒的timeoutTask;
——调用内部API方法
循环遍历任务列表调用任务。timeoutTask WhenAny(任务)如果timeoutTask已完成且任务未完成,则说明已超过超时时间,因此请停止处理。
为了演示这个问题,我创建了一个新的ASP。. NET MVC Web Api项目,并在HomeController的Index()方法中添加了相应的代码。
我还添加了一个AsyncUnitTests.cs类,它具有与Web API方法完全相同的代码。
奇怪的是,单元测试工作如我所期望的,而web api调用没有。
有人有什么想法吗?
示例应用:WebAPIAsync.zip
我解决了!
所有await
调用都需要调用.ConfigureAwait(false)
,如果它们是从任何同步方法调用的,这确保它可以在不同的上下文中继续。
如果您控制了整个调用堆栈,并且可以将其全部异步化,则不需要此模板代码。
但是,如果你不能控制整个调用堆栈(例如,你写了一个Nuget包,但不确定消费者是谁),那么这将避免问题。