Я, наверное, упускаю здесь что-то очевидное.
Я использую те HttpClient
броски, HttpRequestException
которые содержатся StatusCode
в строке сообщения.
Как я могу получить к нему доступ StatusCode
?
Изменить : Дополнительная информация, я написал этот вопрос в спешке.
Я использую HttpClient
для доступа к другому API в моем проекте WebApi. Да, я знаю, зачем звоню EnsureSuccessStatusCode()
. Я хочу распространить некоторые ошибки ниже по течению, например 404 и 403.
Все, что я хотел, это постоянно переходить HttpRequestException
на HttpResponseException
использование кастомов ExceptionFilterAttribute
.
К сожалению, HttpRequestException
не содержит дополнительной информации, которую я мог бы использовать, кроме сообщения. Я надеялся раскрыть StatusCode
в сырой форме (int или enum).
Похоже, я могу:
- Используйте сообщение, чтобы переключить код состояния (bleh)
- Или создайте мою версию EnsureSuccessStatusCode и создайте исключение, которое действительно можно использовать.
источник
Ответы:
Код состояния был передан как часть строки,
HttpRequestException
поэтому вы не можете восстановить его только из таких исключений.Конструкция
System.Net.Http
требует доступа,HttpResponseMessage.StatusCode
а не ожидания исключения.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Если вы сейчас следуете руководству Microsoft , убедитесь, что вы четко понимаете, почему он просит вас позвонить
HttpResponseMessage.EnsureSucessStatusCode
. Если вы не вызываете эту функцию, исключений быть не должно.источник
Как бы то ни было, этот парень сделал кое-что умное: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception-the-remote-name? forum = csharpgeneral
В случае, если мне нужно свойство статуса исключения, я могу сделать это:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }
источник
requestException.InnerException
имеет значение null, поэтому это не сработаетКак упоминалось другими, также не рекомендуется получать StatusCode из HttpRequestException, то же самое можно сделать заранее с HttpResponseMessage.StatusCode после проверки HttpResponseMessage.IsSuccessStatusCode
В любом случае, если из-за какого-то ограничения / требования нужно прочитать StatusCode, может быть два решения
Ниже приведен код в System.Net.Http.HttpResponseMessage, где SR.net_http_message_not_success_statuscode = "Код состояния ответа не указывает на успех: {0} ({1})".
public HttpResponseMessage EnsureSuccessStatusCode() { if (!this.IsSuccessStatusCode) { if (this.content != null) { this.content.Dispose(); } throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[] { (int)this.statusCode, this.ReasonPhrase })); } return this; }
источник
Это сработало для меня
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
источник