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 } }
С помощью оператор (
?.) вы можете получить код состояния HTTP с помощью одной строки кода:HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;переменная
statusсодержитHttpStatusCode. Когда есть более общий сбой, такой как сетевая ошибка, где код состояния HTTP никогда не отправляется, тоstatusбудет null. В этом случае вы можете проверитьex.Statusдля полученияWebExceptionStatus.если вы просто хотите, чтобы описательная строка войти в случае сбоя вы можете с помощью нуль-коалесцирующий оператор (
??), чтобы получить соответствующие ошибки:string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString() ?? ex.Status.ToString();если исключение возникает в результате кода состояния HTTP 404, строка будет содержать "NotFound". С другой стороны, если сервер находится в автономном режиме строка будет содержать "ConnectFailure" и так далее.
(и для всех, кто хочет знать, как получить http substatus код. Это невозможно. Это Microsoft IIS концепция, которая есть только вошел на сервер и никогда не отправлял клиенту.)
это работает только в том случае, если 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, когда оно не соответствует вашим критериям, поскольку мы не вводим предложение в первую очередь с вышеуказанным решением.
Я не уверен, что есть, но если бы было такое свойство, оно не считалось бы надежным. А
WebExceptionможет быть уволен по причинам, отличным от кодов ошибок HTTP, включая простые сетевые ошибки. У них нет такого совпадающего кода ошибки http.можете ли вы дать нам немного больше информации о том, что вы пытаетесь сделать с этим кодом. Возможно, есть лучший способ получить необходимую вам информацию.
вы можете попробовать этот код, чтобы получить код состояния HTTP из WebException. Он также работает в Silverlight, потому что SL не имеет WebExceptionStatus.Определена ошибка протокола.
HttpStatusCode GetHttpStatusCode(WebException we) { if (we.Response is HttpWebResponse) { HttpWebResponse response = (HttpWebResponse)we.Response; return response.StatusCode; } return null; }
Comments