C# HttpClient - Как получить сообщение об ошибке с сервера NestJS

Доброго времени суток.
Суть вопроса такова - есть desktop-приложение C# WPF, которое взаимодействует с сервером, написанном на NestJS через HttpClient.

Возникла проблема с обработкой исключений, а именно - вместо текста ошибки, который приходит с сервера, HttpClient подставляет свой текст, что меня не устраивает. Статус-код ошибки при этом возвращается корректно.

Часть кода функции, которая отправляет http запрос на сервер:

try
{
   var queryString = "?id=" + userID;
   HttpResponseMessage response = await api.GetAsync("user/" + queryString);
   response.EnsureSuccessStatusCode();
   user = await response.Content.ReadFromJsonAsync<IUser>();

}
catch (HttpRequestException ex)
{
    Console.WriteLine(ex.Message);
}

Как выглядит объект ошибки, которая отправляется с сервера:

{
   "statusCode": 404,
   "message": "По Вашему запросу ничего не найдено"
}

Какой текст ошибки получает пользователь в приложении:

Response status code does not indicate success: 404 (Not Found).

Грубо говоря, текст в поле message заменяется обычным шаблонным текстом, не несущим никакого смысла для пользователя.

Подскажите, пожалуйста, возможно ли как-то получить текст ошибки, приходящий именно с сервера, минуя шаблонный текст HttpClient?


Ответы (2 шт):

Автор решения: Grundy

HttpRequestException - в данном случае, это исключение бросаемое при проверке статуса (response.EnsureSuccessStatusCode();), и показывает только информацию связанную со статусом отличным от 2хх.

Для получения информации отправленной сервером, нужно, также как и при успешном ответе, прочитать тело сообщения

catch (HttpRequestException ex)
{
    Console.WriteLine(ex.Message);
    var error = await response.Content.ReadFromJsonAsync<ErrorType>();
}
→ Ссылка
Автор решения: aepot

Вам нужно прочитать ошибку, а вы бросаете исключение. Оно само её не вычитает.

try
{
    string queryString = $"?id={userID}";
    using HttpResponseMessage response = await api.GetAsync("user/" + queryString);
    if (response.IsSuccessStatusCode)
    {
        user = await response.Content.ReadFromJsonAsync<IUser>();
    }
    else
    {
        IError error = await response.Content.ReadFromJsonAsync<IError>();
        throw new Exception($"[{error.StatusCode}] {error.Message}");
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
→ Ссылка