Obtener el número de código de estado Http (200, 301, 404, etc.) de HttpWebRequest y HttpWebResponse


289

Estoy tratando de obtener el número de código de estado HTTP del HttpWebResponseobjeto devuelto por a 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 además de crear una función de interruptor grande? Gracias.

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

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

Respuestas:


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

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

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

1
pero en caso de excepción "connectfailure" de webexception obtengo una respuesta nula, en ese caso, ¿cómo puedo obtener el código httpstatus
Rusty

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

3
¿Cómo obtener el valor de HTTP Substatus ? Por ejemplo, 404.13 Contenido demasiado largo Referencia: iis.net/configreference/system.webserver/security/…
Kiquenet

99
Bonus:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain el

12
@Alain Doble bonificación; bool success = response.IsSuccessStatusCode;
htxryan

244

Debe tener cuidado, las respuestas del servidor en el rango de 4xx y 5xx arrojan una WebException. Necesita 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;
}

Me alegra que hayas mencionado el 4xx y el 5xx porque tenía problemas con un programa que no funcionaba correctamente. Sin embargo, debo señalar que el .NET Framework actual le notificará cualquier excepción no detectada, por lo que esto también es obvio.
Joel Trauger

Como beneficio adicional, uno podía decorar un método con [DebuggerNonUserCode] y el depurador no se detendría en ese método cuando se lanza una excepción. De esta manera, las excepciones mal diseñadas pueden ser envueltas e ignoradas. Pero ahora se requiere
crokusek

21

Según 'dtb', debe usar HttpStatusCode, pero después de 'zeldi' debe tener mucho cuidado con las respuestas de código> = 400.

Esto me ha funcionado:

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 implementa IDisposable, por lo que lidiar con eso puede ser complicado. En su lugar, puede usar lo siguiente que le permite declarar "respuesta" dentro de un bloque de uso: public HttpWebResponse GetSafeResponse (solicitud HttpWebRequest) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

Solo coaccionar StatusCodea la 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
Esto es vb.net, el OP está usando C #
Kemuel Sanchez

2
..y estoy usando vb. Me alegro de que esta respuesta estuviera aquí.
Dibujó el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.