Ответ
При отмене 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("Запрос отменен из-за сетевой проблемы.");
}
Важные детали:
- Отмена запроса, а не ответа: Прерывается процесс отправки запроса или получения ответа. Если ответ уже начал поступать, может быть получена частично прочитанная или поврежденная data.
- Освобождение ресурсов: Клиент попытается закрыть сетевое соединение. Корректная работа требует правильного использования
HttpClient(предпочтительно черезIHttpClientFactory). - Идемпотентность: Отмена безопасна для идемпотентных методов (GET, PUT, DELETE). Для POST может потребоваться дополнительная логика на стороне сервера для обработки прерванных операций.