Я делаю ~ 20 запросов http, используя один httpclient, этот httpclient долгое время жизни, что означает, что он не упакован в оператор использования. Поскольку веб-сервис обычно довольно быстрый (время отклика ~ 200 мс), я установил тайм-аут на 5 с.
Теперь я столкнулся с проблемой: если один запрос заканчивается в это время, все другие запросы отменяются. Это нормальное поведение?
Вот код, который я использую для одновременных звонков
public async Task GetAll()
{
await Task.WhenAll(x => x.Select(xx => GetData(xx.Id));
}
Код для вызова API:
public async Task GetData(int id)
{
string payload = "";
try
{
var resp = await base.GetAsync($"/apis/v2/getdata/{id}");
if (!resp.IsSuccessStatusCode)
Console.WriteLine("Error");
payload = await resp.Content.ReadAsStringAsync();
Console.WriteLine(payload);
}
catch (System.Exception ex)
{
Console.WriteLine("Error");
}
}
Мой базовый класс HttpClient
public class MyHttpClient : System.Net.Http.HttpClient
{
public Logger Log { get; set; }
}
Если я запускаю задачу в последовательном порядке, все работает нормально, но когда я запускаю их параллельно и одна задача запускается по таймауту, все остальные не завершенные задачи будут отменены.