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

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,
    ...
}

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;
}

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

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;
}

4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)

1
Ceci est vb.net, l'OP utilise C #
Kemuel Sanchez

2
..et j'utilise vb. Heureux que cette réponse soit là.
Drew
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.