Sobes.tech
Назад к вопросам
Junior — Middle
56

Какие действия предпринимает HTTP-клиент, если отменяется связанный с запросом токен?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Если токен отмены связан с HTTP-запросом и его отменяют, клиент прекращает ожидание ответа и пытается остановить выполнение запроса. Обычно это приводит к выбрасыванию исключения, связанного с отменой, а не к успешному завершению запроса. Важный момент: отмена не гарантирует, что запрос не дошёл до сервера, она лишь отменяет обработку на клиенте.

Определение:

В C# при использовании CancellationToken с HTTP-клиентом токен позволяет кооперативно отменять асинхронную операцию. Если токен был отменён во время выполнения запроса, HttpClient завершает операцию с ошибкой отмены, обычно через OperationCanceledException или TaskCanceledException. Это стандартный механизм для остановки длительных сетевых операций без ожидания их естественного завершения.

Пример использования:

using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

var httpClient = new HttpClient();
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2));

try
{
    var response = await httpClient.GetAsync("https://example.com/api/data", cts.Token);
    response.EnsureSuccessStatusCode();
}
catch (OperationCanceledException)
{
    Console.WriteLine("Запрос был отменён по токену.");
}

Пояснение кода:

Код не требует отдельной логики обработки внутри HttpClient; отмена происходит через переданный токен.

  1. Создаётся CancellationTokenSource с таймаутом 2 секунды.
  2. Его токен передаётся в GetAsync.
  3. Если запрос не успевает завершиться до отмены, операция прерывается.
  4. В catch ловится исключение отмены, и приложение может корректно обработать этот сценарий.
  5. Если ответ успел прийти раньше отмены, запрос завершается успешно.

Ключевые моменты:

  • Отмена токена останавливает асинхронную операцию на клиенте.
  • При отмене обычно выбрасывается OperationCanceledException/TaskCanceledException.
  • Отмена не равна ошибке HTTP-уровня: это отдельный сценарий выполнения.
  • Токен нужно передавать в метод запроса, иначе отмена не сработает.
  • Отмена не гарантирует, что сервер не получил запрос; она прекращает ожидание и обработку на клиенте.