Відповіді:
Можливо, щось подібне ...
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
.
Якщо ви просто хочете, щоб описовий рядок входив у журнал у разі відмови, ви можете скористатися оператором зв'язання з нулем ( ??
), щоб отримати відповідну помилку:
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 (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)
Нарешті: зауважте, як немає потреби повторно кидати виняток у пункті вилову, якщо він не відповідає вашим критеріям, оскільки ми не вводимо цей пункт в першу чергу з вищевказаним рішенням.
Ви можете спробувати цей код, щоб отримати код статусу 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);}
Я не впевнений, чи є, але якби було таке майно, це не вважалося б надійним. А WebException
може бути звільнено з причин, відмінних від кодів помилок HTTP, включаючи прості помилки в мережі. У них немає такого відповідного коду помилки http.
Чи можете ви надати нам трохи більше інформації про те, що ви намагаєтеся виконати з цим кодом. Можливо, буде кращий спосіб отримати потрібну інформацію.