Ответы:
Может быть как то так ...
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
}
}
Используя нулевой условный оператор ( ?.
), вы можете получить код состояния 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, которая регистрируется только на сервере и никогда не отправляется клиенту.)
?.
оператор первоначально назван нулевым оператором распространения или нулевым условным оператором во время предварительного просмотра. Но Atlassian Resharper предупреждает об использовании нулевого оператора распространения в таких сценариях. Приятно знать, что его еще называют нулевым условным оператором.
это работает, только если 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?
( обнуляемый )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Я не уверен, что есть, но если бы была такая собственность, она не была бы признана надежной. A WebException
может быть запущено по причинам, отличным от кодов ошибок HTTP, включая простые сетевые ошибки. У тех нет такого совпадающего кода ошибки http.
Можете ли вы дать нам немного больше информации о том, что вы пытаетесь достичь с помощью этого кода. Там может быть лучший способ получить необходимую информацию.