System.Net.HttpClient: Сбой SendAsync с OperationCanceledException без запроса http через сеть - PullRequest
0 голосов
/ 10 декабря 2018

Мы используем System.Net.Http.HttpClient для вызовов между микросервисами внутри k8s.

  • ОС Linux (внутри докера)
  • dotnet TargetFramework: netcoreapp2.1
  • сервер:Протокол Kestrel
  • : http

Несколько дней назад мы заметили очень странное поведение вызовов http: некоторые вызовы между микросервисами (около 2-3%) завершались с ошибкой

System.OperationCanceledException: The operation was canceled.
   at System.Net.Http.HttpClient.HandleFinishSendAsyncError(Exception e, CancellationTokenSource cts)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at OurCode.HttpServiceClient.GetStringResponseAsync(String methodUri, HttpMethod httpMethod)
   ...another our code...

после нашего тайм-аута для http-звонков (это 3 секунды).Но не было журналов о вызове внутри службы вызываемого абонента.

Мы включили пакетный ритм для отслеживания http-запросов, а также заметили, что никакие http-запросы от службы вызывающего абонента к службе вызываемого абонента не выполнялись.Процессор, память и сеть для этих служб были в порядке все время.

Упрощенная версия нашего кода для вызовов http выглядит следующим образом:

public async Task<string> GetStringResponseAsync(String methodUri,  HttpMethod httpMethod)
{
    int timeoutInMilliseconds = 3000;
    var tokenSource = new CancellationTokenSource();
    var rm = new HttpRequestMessage(httpMethod, methodUri);
    Task<HttpResponseMessage> httpTask = HttpClient.SendAsync(rm, tokenSource.Token);
    tokenSource.CancelAfter(timeoutInMilliseconds);
    HttpResponseMessage response = await httpTask;
    await EnsureSuccessStatusCode(response);
    return await response.Content.ReadAsStringAsync();
}

Любые идеи о том, какая проблема может вызвать это странное поведениебез http запроса через сеть, и что я могу сделать для дальнейшего исследования?

1 Ответ

0 голосов
/ 10 декабря 2018

Это просто означало, что веб-служба не ответила.

HttpClient выдает TaskCanceledException (который наследуется от OperationCanceledException) по истечении времени ожидания.Это не интуитивно понятно и не имеет никакого смысла для меня (и других), но, к сожалению, это то, что он делает.

Здесь обсуждается здесь (несколько человек упомянули некоторые обходные пути, чтобы отличить тайм-аут от истинной отмены, если вам не все равно).

...