Как получить StatusCode из HttpRequestException?
Я, наверное, упускаю что-то очевидное.
Я использую HttpClient
, который бросает HttpRequestException
, которая содержит StatusCode
в строке сообщения.
как я могу получить доступ к этому StatusCode
?
редактировать: больше информации, я написал этот вопрос в спешке.
Я использую HttpClient
для доступа к другому API в моем проекте WebApi. Да, я знаю, почему звоню!--5-->. Я хочу распространить некоторые ошибки вниз по течению, такие как 404 и 403.
все, что я хотел последовательно трансформирует HttpRequestException
на HttpResponseException
С помощью настраиваемых ExceptionFilterAttribute
.
к сожалению, HttpRequestException
не несет никакой дополнительной информации, которую я мог бы использовать, кроме сообщения. Я надеялся раскрыть StatusCode
в необработанной форме (int или enum).
похоже, я тоже могу:
- используйте сообщение для переключения кода состояния (bleh)
- или создать мою версию EnsureSuccessStatusCode и выбросить исключение, которое вообще-то можно.
4 ответов
код состояния был передан как часть строки в 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)requestException.InnerException).Status == WebExceptionStatus.NameResolutionFailure)
{
return true;
}
return false;
}
Как упоминалось другими, также не рекомендуется получать StatusCode из HttpRequestException, то же самое можно сделать заранее с HttpResponseMessage.StatusCode после проверки HttpResponseMessage.IsSuccessStatusCode
в любом случае, если из-за некоторых ограничений / требований необходимо прочитать StatusCode, Может быть два решения
- расширил HttpResponseMessage с вашим пользовательским исключением, объясненным здесь
- рубить на исключение HttpRequestException.ToString для получения состояния, как постоянная разноска по statusCode и Repharse.
ниже код в системе.Чистая.Протоколу 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)