Obtendo o número do código de status Http (200, 301, 404 etc.) de HttpWebRequest e HttpWebResponse

289

Estou tentando obter o número do código de status HTTP do HttpWebResponseobjeto retornado de a HttpWebRequest. Eu esperava obter os números reais (200, 301,302, 404 etc.) em vez da descrição do texto. ("Ok", "MovedPermanently" etc.) O número está oculto em uma propriedade em algum lugar do objeto de resposta? Alguma idéia que não seja a criação de uma grande função de switch? Obrigado.

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
fonte
Para a ação oposta: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

Respostas:

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

HttpStatusCode (o tipo de response.StatusCode) é uma enumeração em que os valores dos membros correspondem aos códigos de status HTTP, por exemplo

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}
dtb
fonte
1
mas no caso de exceção "connectfailure" de WebException i obter uma resposta como null, nesse caso, como posso obter o código httpStatus
Rusty
10
@ enferrujado: se a conexão falhar e, portanto, a solicitação não puder ser enviada e nenhuma resposta puder ser recebida, não haverá código de status http.
1013 Oliver
3
Como obter o valor HTTP Substatus ? Por exemplo, 404.13 Referência de tamanho muito grande do conteúdo : iis.net/configreference/system.webserver/security/…
Kiquenet 14/04/2015
9
Bônus:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain
12
@Alain bônus duplo; sucesso bool = response.IsSuccessStatusCode;
htxryan 18/09/16
244

Você precisa ter cuidado, as respostas do servidor no intervalo de 4xx e 5xx geram uma WebException. Você precisa pegá-lo e obter o código de status de um objeto WebException:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}
zeldi
fonte
Estou feliz que você mencionou o 4xx e o 5xx porque eu estava tendo problemas com um programa que não estava funcionando corretamente. Devo salientar, porém, que a atual estrutura .NET o notificará de quaisquer exceções não capturadas, portanto, isso também é fácil.
Joel Trauger
Como bônus, costumava-se decorar um método com [DebuggerNonUserCode] e o Depurador não parava nesse método quando uma exceção é lançada. Dessa maneira, as exceções mal projetadas podem ser quebradas e ignoradas. Mas agora a configuração do registro é necessária
crokusek
21

De acordo com 'dtb', você precisa usar HttpStatusCode, mas após 'zeldi', você precisa ter cuidado extra com respostas de código> = 400.

Isso tem funcionado para mim:

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
fonte
O HttpWebResponse implementa IDisposable, portanto, lidar com isso pode ser complicado. Você pode usar o seguinte, que permite declarar "resposta" dentro de um bloco de uso: public HttpWebResponse GetSafeResponse (solicitação de HttpWebRequest) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ
11

Apenas coagir o StatusCodepara 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;
}
Marc
fonte
4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
Prestigiado
fonte
1
Este é vb.net, a OP é usando C #
Camuel Sanchez
2
..e eu estou usando vb. Ainda bem que esta resposta estava aqui.
Tirou