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

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

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

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

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.