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());
James Lawruk
sumber
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,
    ...
}
dtb
sumber
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;
}
zeldi
sumber
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());
Wojciech Jakubas
sumber
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;
}
Marc
sumber
4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)
bergengsi
sumber
1
Ini vb.net, OP menggunakan C #
Kemuel Sanchez
2
..dan saya menggunakan vb. Senang jawaban ini ada di sini.
Drew