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());
James Lawruk
fuente
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,
    ...
}
dtb
fuente
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;
}
zeldi
fuente
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());
Wojciech Jakubas
fuente
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;
}
Bagazo
fuente
4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
prestigioso
fuente
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