2009-08-25 72 views
221

我想從HttpWebRequest返回HttpWebResponse對象的HTTP狀態代碼號。我希望得到實際的數字(200,301,302,404等),而不是文字說明。 (「Ok」,「MovedPermanently」等)數字是否埋在響應對象某處的某個屬性中?除了創建一個大開關功能以外的任何想法?謝謝。從HttpWebRequest和HttpWebResponse獲取Http狀態代碼號(200,301,404等)

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

對於相反的動作:httpResponse.HTTPStatusCode =(HttpStatusCode)Enum.ToObject(typeof運算(HttpStatusCode),404)) – 2017-05-03 19:20:08

回答

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

HttpStatusCode(的response.StatusCode的類型)是其中成員的值匹配HTTP狀態代碼的枚舉,例如

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

但是在引發WebException的 「connectfailure」 異常的情況下,我得到響應爲空,在這種情況下我如何獲取httpstatus代碼 – Rusty 2014-03-20 10:33:32

+7

@rusty:如果連接失敗,因此無法發送請求並且無法收到響應,則不會有任何http狀態碼。 – Oliver 2014-04-10 11:34:21

+3

如何獲取** HTTP Substatus **值?例如,_404.13內容長度太大_參考:http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits – Kiquenet 2015-04-14 08:57:22

220

您必須小心,4xx和5xx範圍內的服務器響應會引發WebException。你必須抓住它,然後從引發WebException對象獲取狀態代碼:

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

我很高興你提到了4xx和5xx,因爲我遇到了程序運行不正常的問題。我應該指出,儘管目前的.NET框架會通知你任何未捕獲的異常,所以這也是一個明智之舉。 – 2016-09-20 16:49:21

+0

作爲一個獎勵,一個曾經能夠用[DebuggerNonUserCode]來裝飾一個方法,並且在引發異常時調試器不會停止在該方法中。通過這種方式[設計不佳](https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/#comment-85105)可以被包裝並忽略。但現在[註冊表設置是必需的](https://blogs.msdn.microsoft.com/devops/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015) – crokusek 2017-10-11 02:36:03

9

按照「DTB」你需要使用HttpStatusCode,但以下「zeldi」你必須要格外小心代碼響應> = 400.

這工作對我來說:

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()); 
0
//Response being your httpwebresponse 
Dim str_StatusCode as String = CInt(Response.StatusCode) 
Console.Writeline(str_StatusCode) 
+0

這是vb .net,OP使用C# – 2017-09-08 14:10:46

0

就要挾StatusCodeint

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; 
}