Nhận số mã trạng thái http (200, 301, 404, v.v.) từ HttpWebRequest và HttpWebResponse


289

Tôi đang cố gắng để có được số mã trạng thái HTTP từ HttpWebResponseđối tượng được trả về từ a HttpWebRequest. Tôi đã hy vọng có được những con số thực tế (200, 301.302, 404, v.v.) chứ không phải là mô tả văn bản. ("Ok", "MovedPternal", 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.

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

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

Câu trả lời:


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

HttpStatusCode (loại response.StatusCode) là một bảng liệt kê trong đó các giá trị của các thành viên khớp với mã trạng thái HTTP, ví dụ:

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

1
nhưng trong trường hợp "kết nối ngoại lệ" ngoại trừ webexception tôi nhận được phản hồi là null, trong trường hợp đó làm thế nào tôi có thể nhận được mã httpstatus
Rusty

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

3
Làm thế nào để có được giá trị HTTP Substatus ? Ví dụ: 404.13 Độ dài nội dung Tham chiếu quá lớn : iis.net/configreference/system.webserver/security/ ám
Kiquenet

9
Tiền thưởng:bool success = ((int)response.StatusCode) >= 200 && ((int)response.StatusCode) < 300;
Alain

12
@ Alain Nhân đôi tiền thưởng; bool thành công = hồi đáp.IsSuccessStatusCode;
htxryan

244

Bạn phải cẩn thận, các phản hồi của máy chủ trong phạm vi 4xx và 5xx sẽ ném WebException. Bạn cần phải bắt nó và sau đó lấy 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;
}

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

Như một phần thưởng, người ta đã từng có thể trang trí một phương thức bằng [DebuggerNonUserCode] và Debugger sẽ không dừng lại trong phương thức đó khi ném ngoại lệ. Theo cách này, các ngoại lệ được thiết kế kém có thể được gói và bỏ qua. Nhưng bây giờ cần có cài đặt đăng ký
crokusek

21

Theo 'dtb', bạn cần sử dụng HttpStatusCode, nhưng theo 'zeldi', bạn cần hết sức cẩn thận với các phản hồi mã> = 400.

Điều 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());

HttpWebResponse triển khai IDis Dùng để xử lý việc đó có thể khó khăn. Thay vào đó, bạn có thể sử dụng cách sau đây cho phép bạn khai báo "phản hồi" bên trong một khối đang sử dụng: công khai httpWebResponse GetSafeResponse (yêu cầu httpWebRequest) {thử {return (httpWebResponse) request.GetResponse (); } Catch (WebException chúng tôi) {return (HttpWebResponse) we.Response; }}
DesertFoxAZ

11

Chỉ cần cưỡng chế 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;
}

4
//Response being your httpwebresponse
Dim str_StatusCode as String = CInt(Response.StatusCode)
Console.Writeline(str_StatusCode)

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

2
..và tôi đang sử dụng vb. Vui mừng câu trả lời này đã ở đây.
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.