Обработка исключений в HttpResponse asp. net - PullRequest
0 голосов
/ 17 апреля 2020

Я спорю с собой о том, как обрабатывать исключения при вызове конечной точки rest-API. Я десериализирую контент прямо из потока, чтобы избежать выделения строки. Проблема, которая возникает, заключается в том, что если сервер возвращает внутреннюю ошибку сервера (500) с некоторой информацией в контенте, моя десериализация завершается неудачно из-за JSON, и если я вызываю responseMessage.EnsureSuccessStatusCode(), я теряю информацию в контенте.

var responseMessage = await _httpClient.SendAsync(request).ConfigureAwait(false);
responseMessage.EnsureSuccessStatusCode();

using (var stream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
using (var streamReader = new StreamReader(stream))
using (var reader = new JsonTextReader(streamReader))
{
   return _jsonSerializer.Deserialize<List<string>>(reader);
}

Как обрабатывать сведения об исключениях, которые могут существовать в Контенте?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Также могут быть ситуации, когда сервер вообще ничего не возвращает, вместо того, чтобы вы столкнулись с одним из следующих исключений:

  • ArgumentException / ArgumentNullException / ArgumentOutOfRangeException
    • Происходит:
      • Когда указанная строка не может быть проанализирована как URI
      • Когда установщик Timeout / MaxResponseContentBufferSize получает слишком маленький / слишком большой ввод
    • Обработка:
      • Предупреждение
        • Использование Uri.TryCreate для анализа строки
        • Использование строго типизированных перегрузок
        • НЕ должен поймать его, следует предотвратить
  • WebException
    • Происходит:
      • Когда по какой-то причине базовая сеть дает сбой (см. status для более подробной информации)
    • Обработка:
      • Обнаружение
        • В основном это завернутый в HttpRequestException
      • Смягчение
  • InvalidOperationException
    • Происходит:
      • Когда вызыватель BaseAddress вызывается после отправки запроса
      • Когда вызыватель Timeout вызывается после отправки запроса
      • Когда вызыватель MaxResponseContentBufferSize вызывается после отправки запроса
      • Когда операция уже началась и запрошена повторная отправка
    • Обработка:
      • Предотвращение
        • Старайтесь избегать установки "глобальных" свойств
      • Обнаружение
        • Может быть выброшено индивидуально или внутри WebException
      • Смягчение
  • HttpException
    • Происходит:
      • ASP. NET может выдать это исключение
    • Обработка:
  • TaskCanceledException
    • Происходит:
      • Когда запрос отменен
      • Когда время запроса истекло
    • Обработка:
      • Предотвращение
        • Настройте среду времени ожидания, указав c
      • Обнаружение
      • Смягчение
        • Используйте повторную попытку с экспоненциальным откатом, если запрос идемпотентен
  • HttpRequestException
    • Происходит:
      • Большинство вышеупомянутых исключений заключены в HRE
      • При вызове EnsureSuccessStatusCode и код состояния отличается от 2xx
    • Обработка:
      • Профилактика
        • НЕ звонить EnsureSuccessStatusCode
        • Проверять коды состояния явно
      • Обнаружение
        • Определенно следует быть пойманным и InnerException должен быть осмотрен * 1 206 *
        • Обратите внимание на ограничения StatusCode
  • SocketException
    • Происходит:
      • Когда новый запрос запрашивается от удаленного httpClient
      • Когда соединения открываются слишком часто (исчерпывает пул)
    • Обработка :
      • Предотвращение
        • Не создавать новый httpClient для каждого запроса
        • Использовать его как предназначено
        • Использовать HttpClientFactory
      • Обнаружение
        • Измерьте и измените размер пула, если это разумно
        • Проверьте SocketErrorCode
  • IOException
    • Происходит:
      • Когда невозможно прочитать ответ из основного сетевого потока
      • Когда используется неправильная версия TLS
    • Обработка:
      • Предотвращение
      • Обнаружение
        • Большую часть времени они заключены в капсулу таким образом:
        • HttpRequestException> WebException> IOException> SocketException
0 голосов
/ 17 апреля 2020

@ Огуз Озгул как то так?

if(responseMessage.IsSuccessStatusCode)
{
    using (var stream = await responseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false))
    using (var streamReader = new StreamReader(stream))
    using (var reader = new JsonTextReader(streamReader))
    {
        return _jsonSerializer.Deserialize<List<string>>(reader);
    }
}
else
{
    var result = await responseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
    throw new HttpRequestException(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...