2009-08-25 17 views
221

Estoy tratando de obtener el número de código de estado HTTP del objeto HttpWebResponse devuelto desde HttpWebRequest. Esperaba obtener los números reales (200, 301, 302, 404, etc.) en lugar de la descripción del texto. ("Ok", "MovedPermanently", etc.) ¿Está enterrado el número en una propiedad en algún lugar del objeto de respuesta? ¿Alguna otra idea que no sea crear una gran función de cambio? Gracias.Obteniendo el código de estado de HTTP (200, 301, 404, etc.) de HttpWebRequest y 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

Para la acción opuesta: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404)) –

Respuesta

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

HttpStatusCode (del tipo de response.StatusCode) es una enumeración donde los valores de los miembros coinciden con los códigos de estado HTTP, por ejemplo,

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

pero en caso de excepción "connectfailure" de WebException i obtener la respuesta nula, en ese caso cómo puedo obtener el código httpstatus – Rusty

+7

@rusty: si la conexión falla y, por lo tanto, no se pudo enviar la solicitud y no se pudo recibir ninguna respuesta, no habrá ningún código de estado http. – Oliver

+3

¿Cómo se obtiene ** el valor de HTTP Substatus **? Por ejemplo, _404.13 Content Length Too Large_ Referencia: http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits – Kiquenet

220

Debe tener cuidado, las respuestas del servidor en el rango de 4xx y 5xx arrojan una WebException. Es necesario para atraparlo, y luego obtener el código de estado de un objeto WebException:

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

Me alegra que hayas mencionado el 4xx y 5xx porque tenía problemas con un programa que no funcionaba correctamente. Debo señalar, sin embargo, que el .NET framework actual le notificará sobre cualquier excepción no detectada, por lo que esto también es una obviedad. –

+0

Como extra, uno solía decorar un método con [DebuggerNonUserCode] y el Depurador no se detenía en ese método cuando se lanzaba una excepción. De esta manera, [las excepciones mal diseñadas] (https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/#comment-85105) podrían envolverse e ignorarse. Pero ahora se requiere una [configuración del registro] (https://blogs.msdn.microsoft.com/devops/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015) – crokusek

9

Según 'DTB' es necesario utilizar HttpStatusCode, pero siguiendo 'zeldi' Tienes que ser muy cuidadoso con las respuestas de código> = 400.

Esto ha funcionado para mí:

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

Esto es vb .net, el OP está usando C# –

0

Sólo coaccionar a la StatusCode a 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; 
} 
Cuestiones relacionadas