Вызов веб-API в цикле foreach - ошибка времени ожидания - PullRequest
0 голосов
/ 26 ноября 2018

Я использую .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.Но не повезло.Кто-нибудь может предложить мне правильный и рабочий способ сделать это?

1 Ответ

0 голосов
/ 27 ноября 2018

Мне удалось устранить эту ошибку, создав статический метод HttpClient для GetAsync, а не создавая экземпляр для каждого запроса.Огромное спасибо Джону !!

Я инициализировал статический HttpClient в конструкторе с cookiecontainer.Справка: Использование httpclient во всех методах без потери сеанса и файлов cookie

...