2009-08-25 1 views
221

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

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()); 
+0

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

ответ

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

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

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

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

+7

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

+3

Как получить ** HTTP Substatus ** значение? Например, _404.13 Content Length Too Large_ Reference: http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits – Kiquenet

220

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

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

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

+0

В качестве бонуса, который использовался для украшения метода с помощью [DebuggerNonUserCode] и отладчика, не останавливался бы в этом методе при вызове исключения. Таким образом [неверно оформленные исключения] (https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/#comment-85105) могут быть обернуты и проигнорированы. Но теперь требуется [параметр реестра] (https://blogs.msdn.microsoft.com/devops/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015) – crokusek

9

В соответствии с «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()); 
0
//Response being your httpwebresponse 
Dim str_StatusCode as String = CInt(Response.StatusCode) 
Console.Writeline(str_StatusCode) 
+0

Это vb .net, OP использует C# –

0

Просто принуждать 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; 
}