Mendapatkan nomor kode Status Http (200, 301, 404, dll.) Dari HttpWebRequest dan HttpWebResponse


289

Saya mencoba untuk mendapatkan nomor kode status HTTP dari HttpWebResponseobjek yang dikembalikan dari a HttpWebRequest. Saya berharap mendapatkan angka sebenarnya (200, 301.302, 404, dll.) Daripada deskripsi teks. ("Ok", "MovedPermanently", dll.) Apakah nomor itu terkubur di properti di suatu tempat di objek respons? Adakah ide selain membuat fungsi sakelar besar? Terima kasih.

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

Untuk tindakan sebaliknya: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

Jawaban:


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

HttpStatusCode (tipe response.StatusCode) adalah enumerasi di mana nilai-nilai anggota cocok dengan kode status HTTP, misalnya

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

1
tetapi dalam kasus pengecualian "connectfailure" dari webexception saya mendapatkan respon sebagai nol, dalam hal ini bagaimana saya bisa mendapatkan kode httpstatus
Rusty

10
@usta: Jika koneksi gagal dan permintaan tidak dapat dikirim dan tidak ada jawaban yang diterima, tidak akan ada kode status http.
Oliver

3
Bagaimana mendapatkan nilai HTTP Substatus ? Misalnya, 404,13 Panjang Konten Referensi Terlalu Besar : iis.net/configreference/system.webserver/security/…
Kiquenet

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

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

244

Anda harus berhati-hati, respons server dalam kisaran 4xx dan 5xx melempar WebException. Anda perlu menangkapnya, dan kemudian mendapatkan kode status dari objek WebException:

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

Saya senang Anda menyebutkan 4xx dan 5xx karena saya mengalami masalah dengan program yang tidak bekerja dengan benar. Saya harus menunjukkan bahwa .NET framework saat ini akan memberi tahu Anda tentang pengecualian yang tidak tertangkap, jadi ini juga bukan pilihan.
Joel Trauger

Sebagai bonus, yang digunakan untuk dapat menghias metode dengan [DebuggerNonUserCode] dan Debugger tidak akan berhenti dalam metode itu ketika pengecualian dilemparkan. Dengan cara ini pengecualian yang dirancang dengan buruk dapat dibungkus dan diabaikan. Tapi sekarang pengaturan registri diperlukan
crokusek

21

Sesuai 'dtb' Anda perlu menggunakan HttpStatusCode, tetapi mengikuti 'zeldi' Anda harus ekstra hati-hati dengan respons kode> = 400.

Ini berhasil bagi saya:

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 mengimplementasikan IDisposable sehingga menangani itu bisa rumit. Anda dapat menggunakan yang berikut sebagai gantinya yang memungkinkan Anda untuk mendeklarasikan "respons" di dalam blok use: public HttpWebResponse GetSafeResponse (HttpWebRequest request) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

Paksa saja StatusCodeke 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
Ini vb.net, OP menggunakan C #
Kemuel Sanchez

2
..dan saya menggunakan vb. Senang jawaban ini ada di sini.
Drew
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.