我正在使用.NET Core Web API。我正在使用一些第三方Web api,但我需要在我的Web API中对其进行调用(因此,.NET Core Web API有点像第三方的包装器)。
要获得我的结果,我需要使用foreach循环调用多个第三方api。详细信息如下:
首先是一个Web API调用,它给我约4000行的结果(每一行都是ID和value字段的对象)。
之后,我需要遍历这4000行,并使用每个ID调用另一个API。根据此Web API的结果,我需要检查一些验证并返回有效的验证。
我能够成功进行第一个Web API调用,但是当我循环进行另一个API调用时,会出现超时错误。
我在下面尝试过
1) making batches of 4000 rows and processing in batches.
2) Adding tasks in `foreach` loop and using `Task.WhenAll`
示例:
var batchSize = 50;
var returnData = new List<Order>();
foreach (var batchedItems in inventoriesList.Batch(batchSize)) //4000 rows
{
var tasks = new List<Task<Order>>();
foreach (var item in batchedItems)
{
tasks.Add(GetOrder(item.Value)); //call to another api
}
foreach (var task in await Task.WhenAll(tasks))
{
returnData.Add(task);
}
}
private async Task<Order> GetOrder(string id)
{
var order = await GetAsync<Order>(api-url);
if (order != null
&& order.IsAvailable == false
&& ValidateOrder(order)))
{
isValidOrder = true;
}
return isValidOrder == true ? order : null;
}
我也尝试过使用LINQ,而不是为第二个API做foreach循环 呼叫。像下面一样,
tasks = batchedInventories.Select(t => GetOrder(t.Value));
var result = await Task.WhenAll(tasks);
我也尝试过增加Kestrel的KeepAliveTimeout
。但是没有运气。
有人可以建议我正确和可行的方法来做到这一点吗?
答案 0 :(得分:0)
我设法通过为GetAsync方法创建静态HttpClient而不是为每个请求创建实例来解决此错误。多谢约翰!!
我使用cookiecontainer在构造函数中初始化了静态HttpClient。 参考:Using httpclient throughout methods without losing session and cookies