Отримання коду статусу Http (200, 301, 404 тощо) від HttpWebRequest та HttpWebResponse


289

Я намагаюся отримати номер коду статусу HTTP від HttpWebResponseоб'єкта, повернутого з HttpWebRequest. Я сподівався отримати фактичні числа (200, 301,302, 404 тощо), а не текстовий опис. ("Добре", "Переміщено постійно" тощо. Чи є номер, похований у властивості десь у об'єкті відповіді? Будь-які ідеї, крім створення великої функції перемикача? Дякую.

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 Довжина вмісту Занадто велика довідка: iis.net/configreference/system.webserver/security/…
Kiquenet

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

12
@Alain Подвійний бонус; успіх bool = відповідь.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, тому вирішення цього питання може бути складним. Ви можете використовувати наступне, що дозволяє оголосити "відповідь" всередині використовуючого блоку: загальнодоступний HttpWebResponse GetSafeResponse (HttpWebRequest запит) {спробуйте {return (HttpWebResponse) request.GetResponse (); } лов (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;
}

4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)

1
Це vb.net, ОП використовує C #
Kemuel Sanchez

2
..і я використовую vb. Радий, що ця відповідь була тут.
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.