【发布时间】: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