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

Web API异步超时

我解决了!

所有await调用都需要调用.ConfigureAwait(false),如果它们是从任何同步方法调用的,这确保它可以在不同的上下文中继续。

如果您控制了整个调用堆栈,并且可以将其全部异步化,则不需要此模板代码。

但是,如果你不能控制整个调用堆栈(例如,你写了一个Nuget包,但不确定消费者是谁),那么这将避免问题。