Abrufen der Http-Statuscode-Nummer (200, 301, 404 usw.) von HttpWebRequest und HttpWebResponse

289

Ich versuche, die HTTP-Statuscode-Nummer von dem HttpWebResponseObjekt abzurufen, das von a zurückgegeben wurde HttpWebRequest. Ich hatte gehofft, die tatsächlichen Zahlen (200, 301, 302, 404 usw.) anstelle der Textbeschreibung zu erhalten. ("Ok", "MovedPermanently" usw.) Ist die Nummer in einer Eigenschaft irgendwo im Antwortobjekt vergraben? Irgendwelche anderen Ideen als das Erstellen einer großen Schalterfunktion? Vielen Dank.

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
quelle
Für die entgegengesetzte Aktion: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

Antworten:

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

HttpStatusCode (der Typ von response.StatusCode) ist eine Aufzählung, bei der die Werte der Mitglieder mit den HTTP-Statuscodes übereinstimmen, z

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}
dtb
quelle
1
aber im Falle einer "connectfailure" -Ausnahme von webexception erhalte ich eine Antwort als null. In diesem Fall, wie kann ich den httpstatus-Code erhalten
Rusty
10
@rusty: Wenn die Verbindung fehlgeschlagen ist und die Anfrage nicht gesendet und keine Antwort empfangen werden konnte, gibt es keinen http-Statuscode.
Oliver
3
Wie erhalte ich den HTTP-Substatus- Wert? Beispiel : 404.13
Inhaltslänge
9
Bonus:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain
12
@Alain Doppelbonus; bool success = response.IsSuccessStatusCode;
htxryan
244

Sie müssen vorsichtig sein, Serverantworten im Bereich von 4xx bis 5xx lösen eine WebException aus. Sie müssen es abfangen und dann den Statuscode von einem WebException-Objekt abrufen:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}
Zeldi
quelle
Ich bin froh, dass Sie 4xx und 5xx erwähnt haben, weil ich Probleme mit einem Programm hatte, das nicht richtig funktioniert. Ich möchte jedoch darauf hinweisen, dass das aktuelle .NET-Framework Sie über nicht erfasste Ausnahmen informiert, sodass dies auch ein Kinderspiel ist.
Joel Trauger
Als Bonus war es früher möglich, eine Methode mit [DebuggerNonUserCode] zu dekorieren, und der Debugger hörte in dieser Methode nicht auf, wenn eine Ausnahme ausgelöst wurde. Auf diese Weise könnten schlecht gestaltete Ausnahmen umbrochen und ignoriert werden. Aber jetzt ist eine Registrierungseinstellung erforderlich
crokusek
21

Gemäß 'dtb' müssen Sie HttpStatusCode verwenden, aber nach 'zeldi' müssen Sie bei Code-Antworten> = 400 besonders vorsichtig sein.

Das hat bei mir funktioniert:

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
quelle
HttpWebResponse implementiert IDisposable, daher kann es schwierig sein, damit umzugehen. Sie können stattdessen Folgendes verwenden, um "Antwort" innerhalb eines using-Blocks zu deklarieren: public HttpWebResponse GetSafeResponse (HttpWebRequest-Anforderung) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ
11

Zwinge einfach das StatusCodezu 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
quelle
4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
prestigeträchtig
quelle
1
Dies ist vb.net, das OP verwendet C #
Kemuel Sanchez
2
..und ich benutze vb. Ich bin froh, dass diese Antwort hier war.
Drew