Pobieranie numeru kodu statusu HTTP (200, 301, 404 itd.) Z HttpWebRequest i HttpWebResponse

289

Usiłuję uzyskać numer kodu statusu HTTP z HttpWebResponseobiektu zwróconego z HttpWebRequest. Miałem nadzieję uzyskać rzeczywiste liczby (200, 301,302, 404 itd.) Zamiast opisu tekstowego. („Ok”, „MovedPermanently” itp.) Czy liczba jest zakopana we właściwości gdzieś w obiekcie odpowiedzi? Jakieś pomysły oprócz stworzenia dużej funkcji przełączania? Dzięki.

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
źródło
Dla akcji przeciwnej: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

Odpowiedzi:

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

HttpStatusCode (typ response.StatusCode) to wyliczenie, w którym wartości elementów są zgodne z kodami stanu HTTP, np.

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}
dtb
źródło
1
ale w przypadku wyjątku „connectfailure” wyjątku webex otrzymuję odpowiedź jako zerową, w takim przypadku w jaki sposób mogę uzyskać kod httpstatus
Rusty
10
@ zardzewiały: Jeśli połączenie nie powiedzie się, a zatem żądanie nie może zostać wysłane, a odpowiedź nie może zostać odebrana, nie będzie żadnego kodu stanu HTTP.
Oliver,
3
Jak uzyskać wartość podstanu HTTP ? Na przykład 404.13 Długość treści jest zbyt duża Odniesienie: iis.net/configreference/system.webserver/security/…
Kiquenet
9
Premia:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain
12
@Alain Double bonus; bool success = response.IsSuccessStatusCode;
htxryan
244

Musisz być ostrożny, odpowiedzi serwera w zakresie od 4xx do 5xx zgłaszają wyjątek WebException. Musisz go złapać, a następnie uzyskać kod stanu z obiektu WebException:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}
zeldi
źródło
Cieszę się, że wspomniałeś o 4xx i 5xx, ponieważ miałem problemy z programem, który nie działał poprawnie. Powinienem jednak zaznaczyć, że obecny framework .NET powiadomi cię o wszelkich nieprzechwyconych wyjątkach, więc jest to również oczywiste.
Joel Trauger,
Jako bonus, można było ozdobić metodę za pomocą [DebuggerNonUserCode], a debugger nie zatrzymywał się w tej metodzie, gdy zostanie zgłoszony wyjątek. W ten sposób źle zaprojektowane wyjątki mogą zostać opakowane i zignorowane. Ale teraz wymagane jest ustawienie rejestru
crokusek
21

Zgodnie z „dtb” musisz użyć HttpStatusCode, ale po „zeldi” musisz być bardzo ostrożny z odpowiedziami na kod> = 400.

To zadziałało dla mnie:

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
źródło
HttpWebResponse implementuje IDisposable, więc radzenie sobie z tym może być trudne. Zamiast tego możesz użyć następujących opcji, które pozwalają zadeklarować „odpowiedź” w bloku używanym: public HttpWebResponse GetSafeResponse (żądanie HttpWebRequest) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException my) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ
11

Wystarczy zmusić StatusCodedo 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
źródło
4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
prestiżowy
źródło
1
To jest vb.net, OP używa C #
Kemuel Sanchez
2
..i używam vb. Cieszę się, że ta odpowiedź była tutaj.
Drew