foreach循环中的Web API调用-超时错误

时间:2018-11-26 01:20:17

标签: c# .net-core async-await asp.net-core-webapi dotnet-httpclient

我正在使用.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。但是没有运气。 有人可以建议我正确和可行的方法来做到这一点吗?

1 个答案:

答案 0 :(得分:0)

我设法通过为GetAsync方法创建静态HttpClient而不是为每个请求创建实例来解决此错误。多谢约翰!!

我使用cookiecontainer在构造函数中初始化了静态HttpClient。 参考:Using httpclient throughout methods without losing session and cookies