Ottenere il codice numerico dello stato Http (200, 301, 404, ecc.) Da HttpWebRequest e HttpWebResponse


289

Sto cercando di ottenere il numero di codice di stato HTTP HttpWebResponsedall'oggetto restituito da a HttpWebRequest. Speravo di ottenere i numeri reali (200, 301.302, 404, ecc.) Piuttosto che la descrizione del testo. ("Ok", "MovedPermanently", ecc.) Il numero è sepolto in una proprietà da qualche parte nell'oggetto risposta? Qualche idea diversa dalla creazione di una grande funzione switch? Grazie.

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

Per l'azione opposta: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro,

Risposte:


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

HttpStatusCode (il tipo di response.StatusCode) è un'enumerazione in cui i valori dei membri corrispondono ai codici di stato HTTP, ad es.

public enum HttpStatusCode
{
    ...
    Moved = 301,
    OK = 200,
    Redirect = 302,
    ...
}

1
ma in caso di eccezione "connectfailure" di webexception ricevo risposta come nulla, in quel caso come posso ottenere il codice httpstatus
Rusty

10
@rusty: se la connessione non è riuscita e quindi la richiesta non è stata inviata e non è stata ricevuta alcuna risposta, non ci sarà alcun codice di stato http.
Oliver,

3
Come ottenere il valore HTTP Substatus ? Ad esempio, 404.13 Contenuto troppo lungo Riferimento: iis.net/configreference/system.webserver/security/…
Kiquenet

9
Bonus:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain

12
@Alain Bonus doppio; bool success = response.IsSuccessStatusCode;
htxryan,

244

Devi stare attento, le risposte del server nell'intervallo 4xx e 5xx generano una WebException. Devi prenderlo e quindi ottenere il codice di stato da un oggetto WebException:

try
{
    wResp = (HttpWebResponse)wReq.GetResponse();
    wRespStatusCode = wResp.StatusCode;
}
catch (WebException we)
{
    wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
}

Sono contento che tu abbia menzionato il 4xx e il 5xx perché avevo problemi con un programma che non funzionava correttamente. Vorrei sottolineare che l'attuale framework .NET ti avviserà di eventuali eccezioni non rilevate, quindi anche questo è un gioco da ragazzi.
Joel Trauger,

Come bonus, uno era in grado di decorare un metodo con [DebuggerNonUserCode] e il Debugger non si fermava in quel metodo quando veniva generata un'eccezione. In questo modo eccezioni mal progettate potrebbero essere racchiuse e ignorate. Ma ora è necessaria un'impostazione del registro di sistema
crokusek,

21

Come per 'dtb' devi usare HttpStatusCode, ma seguendo 'zeldi' devi stare molto attento con le risposte del codice> = 400.

Questo ha funzionato per me:

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 implementa IDisposable, quindi gestirlo può essere complicato. È possibile utilizzare invece quanto segue che consente di dichiarare "risposta" all'interno di un blocco using: public HttpWebResponse GetSafeResponse (richiesta HttpWebRequest) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

Basta forzare il 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
Questo è vb.net, l'OP sta usando C #
Kemuel Sanchez l'

2
..e sto usando vb. Sono contento che questa risposta sia stata qui.
Estratto l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.