Получение номера кода статуса Http (200, 301, 404 и т. Д.) Из HttpWebRequest и HttpWebResponse


289

Я пытаюсь получить номер кода состояния HTTP из HttpWebResponseобъекта, возвращенного из HttpWebRequest. Я надеялся получить реальные цифры (200, 301, 302, 404 и т. Д.), А не текстовое описание. («Ok», «MovedPermanently» и т. Д.) Число находится в свойстве где-то в объекте ответа? Любые идеи, кроме создания большой функции переключателя? Спасибо.

HttpWebRequest webRequest = (HttpWebRequest)WebRequest
                                           .Create("http://www.gooogle.com/");
webRequest.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
//Returns "MovedPermanently", not 301 which is what I want.
Console.Write(response.StatusCode.ToString());

Для противоположного действия: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Леандро

Ответы:


402
Console.Write((int)response.StatusCode);

HttpStatusCode (тип response.StatusCode) является перечислением, где значения членов соответствуют кодам состояния HTTP, например

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}

1
но в случае исключения "connectfailure" из webexception я получаю ответ как нулевой, в таком случае как я могу получить код httpstatus
Rusty

10
@rusty: если не удалось установить соединение и, следовательно, запрос не может быть отправлен, а ответ получен не будет, код состояния http не будет.
Оливер

3
Как получить значение HTTP Substatus ? Например, 404.13 Длина содержимого слишком велика
Kiquenet,

9
Бонус:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Алена

12
@Alain Двойной бонус; bool success = response.IsSuccessStatusCode;
htxryan

244

Вы должны быть осторожны, ответы сервера в диапазоне 4xx и 5xx выдают исключение WebException. Вам нужно перехватить его, а затем получить код состояния из объекта WebException:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}

Я рад, что вы упомянули 4xx и 5xx, потому что у меня были проблемы с программой, которая не работает должным образом. Я должен отметить, однако, что текущая платформа .NET будет уведомлять вас о любых необработанных исключениях, так что это тоже легкая задача.
Джоэл Траугер,

В качестве бонуса раньше можно было украсить метод с помощью [DebuggerNonUserCode], и ​​отладчик не останавливался в этом методе, когда выдается исключение. Таким образом, плохо разработанные исключения могут быть обернуты и проигнорированы. Но теперь требуется настройка реестра
crokusek

21

В соответствии с 'dtb' вам нужно использовать HttpStatusCode, но после 'zeldi' вы должны быть очень осторожны с ответами кода> = 400.

Это сработало для меня:

HttpWebResponse response = null;
HttpStatusCode statusCode;
try
{
    response = (HttpWebResponse)request.GetResponse();
}
catch (WebException we)
{
    response = (HttpWebResponse)we.Response;
}

statusCode = response.StatusCode;
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
sResponse = reader.ReadToEnd();
Console.WriteLine(sResponse);
Console.WriteLine("Response Code: " + (int)statusCode + " - " + statusCode.ToString());

HttpWebResponse реализует IDisposable, поэтому работать с ним может быть сложно. Вместо этого вы можете использовать следующее, что позволяет объявлять «ответ» внутри блока using: public HttpWebResponse GetSafeResponse (запрос HttpWebRequest) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

Просто приведи StatusCodeк int.

var statusNumber;
try {
   response = (HttpWebResponse)request.GetResponse();
   // This will have statii from 200 to 30x
   statusNumber = (int)response.StatusCode;
}
catch (WebException we) {
    // Statii 400 to 50x will be here
    statusNumber = (int)we.Response.StatusCode;
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.