Что произойдет в HTTP-клиенте при отмене CancellationToken?

«Что произойдет в HTTP-клиенте при отмене CancellationToken?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При отмене CancellationToken, переданного в асинхронный метод HTTP-клиента (например, HttpClient), выполнение запроса будет прервано, и метод выбросит исключение TaskCanceledException (наследник OperationCanceledException).

Практический пример:

var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5)); // Автоотмена через 5 секунд

try
{
    HttpResponseMessage response = await _httpClient.GetAsync(
        "https://api.example.com/slow-endpoint",
        cts.Token // Токен передается в запрос
    );
    // Обработка ответа...
}
catch (TaskCanceledException) when (cts.Token.IsCancellationRequested)
{
    // Исключение вызвано явной отменой через наш токен
    Console.WriteLine("Запрос отменен по таймауту.");
}
catch (TaskCanceledException)
{
    // Исключение могло быть вызвано сетевыми проблемами (например, таймаутом самого HttpClient)
    Console.WriteLine("Запрос отменен из-за сетевой проблемы.");
}

Важные детали:

  1. Отмена запроса, а не ответа: Прерывается процесс отправки запроса или получения ответа. Если ответ уже начал поступать, может быть получена частично прочитанная или поврежденная data.
  2. Освобождение ресурсов: Клиент попытается закрыть сетевое соединение. Корректная работа требует правильного использования HttpClient (предпочтительно через IHttpClientFactory).
  3. Идемпотентность: Отмена безопасна для идемпотентных методов (GET, PUT, DELETE). Для POST может потребоваться дополнительная логика на стороне сервера для обработки прерванных операций.