Obtention du numéro de code d'état Http (200, 301, 404, etc.) à partir de HttpWebRequest et HttpWebResponse

289

J'essaie d'obtenir le numéro de code d'état HTTP de l' HttpWebResponseobjet renvoyé par a HttpWebRequest. J'espérais obtenir les chiffres réels (200, 301, 302, 404, etc.) plutôt que la description textuelle. ("Ok", "MovedPermanently", etc.) Le numéro est-il enterré dans une propriété quelque part dans l'objet de réponse? Des idées autres que la création d'une fonction de gros interrupteur? Merci.

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
la source
Pour l'action inverse: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

Réponses:

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

HttpStatusCode (le type de response.StatusCode) est une énumération où les valeurs des membres correspondent aux codes d'état HTTP, par exemple

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}
dtb
la source
1
mais en cas d'exception «connectfailure» de webexception, je reçois une réponse nulle, dans ce cas, comment puis-je obtenir le code httpstatus
Rusty
10
@rusty: Si la connexion a échoué et donc la demande n'a pas pu être envoyée et aucune réponse n'a pu être reçue, il n'y aura pas de code d'état http.
Oliver
3
Comment obtenir la valeur du sous- statut HTTP ? Par exemple, 404.13 Longueur du contenu trop grande Référence: iis.net/configreference/system.webserver/security/…
Kiquenet
9
Bonus:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain
12
@Alain Double bonus; bool success = response.IsSuccessStatusCode;
htxryan
244

Vous devez être prudent, les réponses du serveur dans la plage 4xx et 5xx lèvent une exception WebException. Vous devez l'attraper, puis obtenir le code d'état à partir d'un objet WebException:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}
zeldi
la source
Je suis content que vous ayez mentionné les 4xx et 5xx parce que j'avais des problèmes avec un programme qui ne fonctionnait pas correctement. Je dois toutefois souligner que le cadre .NET actuel vous informera de toute exception non détectée, il s'agit donc également d'une évidence.
Joel Trauger
En prime, on pouvait décorer une méthode avec [DebuggerNonUserCode] et le débogueur ne s'arrêtait pas dans cette méthode lorsqu'une exception était levée. De cette manière, des exceptions mal conçues pourraient être encapsulées et ignorées. Mais maintenant, un paramètre de registre est requis
crokusek
21

Selon 'dtb', vous devez utiliser HttpStatusCode, mais après 'zeldi', vous devez être extrêmement prudent avec les réponses de code> = 400.

Cela a fonctionné pour moi:

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
la source
HttpWebResponse implémente IDisposable, donc gérer cela peut être délicat. Vous pouvez utiliser à la place ce qui vous permet de déclarer une "réponse" dans un bloc using: public HttpWebResponse GetSafeResponse (HttpWebRequest request) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ
11

Il suffit de forcer le StatusCodeto 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
la source
4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
prestigieux
la source
1
Ceci est vb.net, l'OP utilise C #
Kemuel Sanchez
2
..et j'utilise vb. Heureux que cette réponse soit là.
Drew