Что делать, если соединение разорвалось во время выполнения REST-запроса?

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

Ответ

Для устойчивости к сбоям сети необходимо реализовать стратегию устойчивых (resilient) HTTP-вызовов. Вот практические шаги:

  1. Повторные попытки (Retry): Использовать библиотеку вроде Polly для повторения неудачных запросов с экспоненциальной задержкой. Важно проверять идемпотентность операции (GET, PUT, DELETE — обычно идемпотентны; для POST нужна осторожность).

    var retryPolicy = Policy
        .Handle<HttpRequestException>()
        .OrResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
        .WaitAndRetryAsync(3, retryAttempt => 
            TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
  2. Аварийный выключатель (Circuit Breaker): Защищает систему от лавинообразных сбоев. При частых ошибках запросы временно блокируются, давая удалённому сервису время на восстановление.

    var circuitBreakerPolicy = Policy
        .Handle<HttpRequestException>()
        .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
  3. Резервный вариант (Fallback): Предоставить альтернативные данные (например, из кеша) или понятное сообщение об ошибке, если сервис недоступен.

  4. Таймауты: Настроить разумные таймауты на уровне HttpClient (например, Timeout = TimeSpan.FromSeconds(60)), чтобы запросы не "висели" бесконечно.

  5. Логирование и мониторинг: Все такие инциденты должны логироваться для анализа стабильности интеграции.

Комбинируя эти стратегии, можно значительно повысить отказоустойчивость клиентских приложений.