Есть ли простой способ получить код состояния HTTP из System.Net.WebException
?
Код состояния HTTP System.Net.WebException
Ответы (6)
Может что-то вроде этого ...
try
{
// ...
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
var response = ex.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
}
else
{
// no http status code available
}
}
else
{
// no http status code available
}
}
as
, который является динамическим преобразованием, поэтому проверка на null заключается в том, чтобы увидеть, сработало ли приведение во время выполнения.
- person ympostor; 27.06.2017
Используя условный оператор null (?.
), вы можете получить HTTP код состояния одной строкой кода:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
Переменная status
будет содержать HttpStatusCode
< / а>. Когда происходит более общий сбой, такой как сетевая ошибка, когда код состояния HTTP не отправляется, тогда status
будет нулевым. В этом случае вы можете проверить ex.Status
, чтобы получить WebExceptionStatus
.
Если вам просто нужна описательная строка для регистрации в случае сбоя, вы можете использовать null -Coalescing оператор (??
), чтобы получить соответствующую ошибку:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
Если исключение возникло в результате кода состояния HTTP 404, строка будет содержать «NotFound». С другой стороны, если сервер отключен, строка будет содержать «ConnectFailure» и так далее.
(И для всех, кто хочет знать, как получить код подстатуса HTTP. Это невозможно. Это концепция Microsoft IIS, которая регистрируется только на сервере и никогда не отправляется клиенту.)
?.
изначально назван оператором распространения null или условным оператором null во время предварительной версии. Но Atlassian resharper выдает предупреждение об использовании оператора нулевого распространения в таких сценариях. Приятно знать, что он также называется условным оператором с нулевым значением.
- person RBT; 05.03.2017
это работает, только если WebResponse является HttpWebResponse.
try
{
...
}
catch (System.Net.WebException exc)
{
var webResponse = exc.Response as System.Net.HttpWebResponse;
if (webResponse != null &&
webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
MessageBox.Show("401");
}
else
throw;
}
(Я понимаю, что вопрос старый, но он входит в число популярных в Google.)
Типичная ситуация, когда вы хотите узнать код ответа, - это обработка исключений. Начиная с C # 7, вы можете использовать сопоставление с образцом, чтобы фактически вводить предложение catch только в том случае, если исключение соответствует вашему предикату:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
Это можно легко распространить на другие уровни, например, в этом случае, когда WebException
фактически был внутренним исключением другого (а нас интересует только 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Наконец: обратите внимание, что нет необходимости повторно генерировать исключение в предложении catch, если оно не соответствует вашим критериям, поскольку мы не вводим предложение в первую очередь с указанным выше решением.
Вы можете попробовать этот код, чтобы получить код состояния HTTP из WebException. Это работает и в Silverlight, потому что SL не имеет определенного WebExceptionStatus.ProtocolError.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? или лучше HttpStatusCode?
(nullable)?
- person Kiquenet; 23.03.2018
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
- person FMFF; 30.11.2018
Я не уверен, есть ли там, но если бы такая собственность была, она не считалась бы надежной. WebException
может быть запущен по причинам, отличным от кодов ошибок HTTP, включая простые сетевые ошибки. У них нет такого совпадающего кода ошибки http.
Не могли бы вы дать нам немного больше информации о том, чего вы пытаетесь достичь с помощью этого кода. Возможно, есть лучший способ получить необходимую информацию.