【问题标题】:Web api call in foreach loop - Timeout Errorforeach 循环中的 Web api 调用 - 超时错误
【发布时间】:2018-11-26 01:20:16
【问题描述】:

我正在使用 .NET Core Web API。我正在使用一些需要在我的 Web API 中调用的第三方 Web API(所以我的 .NET Core Web API 是对第三方的一种包装器)。

为了得到我的结果,我需要使用 foreach 循环调用多个第三方 api。详情如下:

  • 首先是一个 Web API 调用,它给我大约 4000 行的结果(每行是 Id 和值字段的对象)。

  • 之后我需要遍历这 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。但没有运气。 有人可以建议我正确且可行的方法吗?

【问题讨论】:

  • 我建议显示您的GetAsync 代码,如果我的预感是正确的,您可能还需要阅读this。或者,API 会限制您的许多请求,或者您只是用过多的请求使其过载。
  • 是的,我在 GetAsync 中使用“使用”语句并为每个请求创建新的 HttpClient。我将尝试共享单个 httpclient 实例。
  • 只是一个简单的问题,我有 HttpClientHandler (with cookiecontainer) ,我应该如何将它与静态 httpclient 一起使用?
  • 您能否提供确切的错误消息,以及发生错误的代码行。
  • 在开始试验代码之前,您是否真的估计过(或者更好的是尝试使用 Fiddler 之类的东西)向该服务发送 4K 请求并查看需要多长时间?在短时间内发送如此多的请求将压倒几乎所有的请求,除了最强大的服务器......

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多