Я использую .NET Core Web API.Я работаю с некоторыми сторонними веб-API, которые мне нужно вызывать в своем веб-API (поэтому мой .NET Core Web API является своего рода оберткой для сторонних).
Чтобы получить мой результат, мне нужновызовите более одного стороннего API, используя цикл foreach.Подробности приведены ниже:
Сначала будет вызов Web API, который даст мне результат около 4000 строк (каждая строка является объектом полей Id и value).
После этого мне нужно перебрать 4000 строк и, используя каждый Id, мне нужно вызвать другой API.В результате этого веб-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, а не делать цикл foreach дляВторой вызов API.Как и ниже,
tasks = batchedInventories.Select(t => GetOrder(t.Value));
var result = await Task.WhenAll(tasks);
Я также пытался увеличить Kestrel KeepAliveTimeout
.Но не повезло.Кто-нибудь может предложить мне правильный и рабочий способ сделать это?