HttpWebRequest ve HttpWebResponse'den Http Durum kodu numarasını (200, 301, 404 vb.) Alma


289

A HttpWebResponsedöndürülen nesneden HTTP durum kodu numarasını almaya çalışıyorum HttpWebRequest. Metin açıklaması yerine gerçek sayıları (200, 301,302, 404 vb.) Almayı umuyordum. ("Tamam", "MovedPermanently" vb.) Sayı, yanıt nesnesinin bir yerinde bir özelliğe gömüldü mü? Büyük bir anahtar işlevi oluşturmaktan başka fikirleriniz var mı? Teşekkürler.

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

Tersi işlem için: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404))
Leandro

Yanıtlar:


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

HttpStatusCode (türü response.StatusCode), üyelerin değerlerinin HTTP durum kodlarıyla eşleştiği bir numaralandırmadır;

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

1
ancak webexception "connectfailure" istisna durumunda, ben null olarak yanıt almak, bu durumda nasıl httpstatus kodu alabilirim
Rusty

10
@rusty: Bağlantı başarısız olduysa ve bu nedenle istek gönderilemediyse ve yanıt alınamazsa, http durum kodu olmayacaktır.
Oliver

3
HTTP Substatus değeri nasıl alınır ? Örneğin, 404.13 İçerik Uzunluğu Çok Büyük Referans: iis.net/configreference/system.webserver/security/…
Kiquenet

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

12
@Alain Double bonusu; bool başarılı = yanıt.IsSuccessStatusCode;
htxryan

244

Dikkatli olmalısınız, 4xx ve 5xx aralığındaki sunucu yanıtları bir WebException oluşturur. Yakalamanız ve ardından bir WebException nesnesinden durum kodu almanız gerekir:

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

4xx ve 5xx'den bahsettiğinize sevindim çünkü düzgün davranmayan bir programla ilgili sorunlar yaşıyordum. Mevcut .NET framework yakalanmamış istisnaları size bildirir olsa da işaret etmeliyim, bu da bir beyinsiz.
Joel Trauger

Bir bonus olarak, bir yöntem [DebuggerNonUserCode] ile dekore edilebilirdi ve bir istisna atıldığında Debugger bu yöntemde durmazdı. Bu şekilde, kötü tasarlanmış istisnalar sarılabilir ve göz ardı edilebilir. Ama şimdi bir kayıt defteri ayarı gerekli
crokusek

21

'Dtb' 'ye göre HttpStatusCode kullanmanız gerekir, ancak' zeldi 'yi takip ederek> = 400 kod yanıtlarına çok dikkat etmelisiniz.

Bu benim için çalıştı:

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 bu kadar uğraşmak zor olabilir bu yüzden IDisposable uygular. Bunun yerine, bir kullanma bloğunun içinde "yanıt" bildirmenize izin veren aşağıdakileri kullanabilirsiniz: public HttpWebResponse GetSafeResponse (HttpWebRequest istek) {try {return (HttpWebResponse) request.GetResponse (); } catch (WebException we) {dönüş (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

Sadece zorlamak StatusCodeiçin 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
Bu vb.net, OP C # kullanıyor
Kemuel Sanchez

2
..ve vb kullanıyorum. Bu cevabın burada olduğuna sevindim.
Drew
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.