2009-08-25 29 views
221

Tôi đang cố gắng lấy mã số trạng thái HTTP từ đối tượng HttpWebResponse được trả về từ HttpWebRequest. Tôi đã hy vọng để có được những con số thực tế (200, 301,302, 404, vv) chứ không phải là mô tả văn bản. ("Ok", "MovedPermanently", v.v.) Có phải số được chôn trong một tài sản ở đâu đó trong đối tượng phản hồi không? Bất kỳ ý tưởng nào khác ngoài việc tạo ra một chức năng chuyển đổi lớn? Cảm ơn.Nhận mã trạng thái Http (200, 301, 404, v.v.) từ HttpWebRequest và HttpWebResponse

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

Đối với các hành động ngược lại: httpResponse.HTTPStatusCode = (HttpStatusCode) Enum.ToObject (typeof (HttpStatusCode), 404)) –

Trả lời

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

HttpStatusCode (loại response.StatusCode) là một liệt kê nơi các giá trị của các thành viên phù hợp với mã trạng thái HTTP, ví dụ

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

nhưng trong trường hợp của "connectfailure" ngoại trừ WebException tôi nhận được câu trả lời như null, trong trường hợp đó làm thế nào tôi có thể nhận được mã httpstatus – Rusty

+7

@rusty: Nếu kết nối không thành công và do đó yêu cầu không thể gửi được và không có phản hồi nào có thể nhận được, sẽ không có bất kỳ mã trạng thái http nào. – Oliver

+3

Cách nhận ** Giá trị HTTP Substatus **? Ví dụ: _404.13 Độ dài nội dung quá lớn_ Tham khảo: http://www.iis.net/configreference/system.webserver/security/requestfiltering/requestlimits – Kiquenet

220

Bạn phải cẩn thận, phản hồi của máy chủ trong phạm vi 4xx và 5xx ném ngoại lệ trên web. Bạn cần phải nắm bắt nó, và sau đó nhận được mã trạng thái từ một đối tượng WebException:

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

Tôi rất vui vì bạn đã đề cập đến 4xx và 5xx vì tôi gặp sự cố với một chương trình không hoạt động đúng cách. Tôi nên chỉ ra rằng mặc dù khuôn khổ .NET hiện tại sẽ thông báo cho bạn về bất kỳ trường hợp ngoại lệ chưa nắm bắt nào vì vậy đây cũng không phải là trí tuệ. –

+0

Là một phần thưởng, một được sử dụng để có thể trang trí một phương thức với [DebuggerNonUserCode] và Debugger sẽ không dừng lại trong phương thức đó khi một ngoại lệ được ném. Theo cách này, [ngoại lệ được thiết kế kém] (https://blogs.msdn.microsoft.com/ericlippert/2008/09/10/vexing-exceptions/#comment-85105) có thể được gói và bỏ qua. Nhưng bây giờ [yêu cầu cài đặt đăng ký] (https://blogs.msdn.microsoft.com/devops/2016/02/12/using-the-debuggernonusercode-attribute-in-visual-studio-2015) – crokusek

9

Theo 'DTB' bạn cần phải sử dụng HttpStatusCode, nhưng sau 'zeldi' bạn cần phải cẩn thận với câu trả lời code> = 400.

này đã làm việc cho tôi:

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

Đây là vb .net, OP đang sử dụng C# –

0

Chỉ cần ép buộc các StatusCode để 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; 
} 
Các vấn đề liên quan