2012-04-10 35 views
31

Tôi đang cố gắng xác minh sự tồn tại của một Url bằng cách sử dụng HttpWebRequest. Tôi đã tìm thấy một vài ví dụ về cơ bản này:Tại sao HttpWebRequest lại ném một ngoại lệ thay vì trả về HttpStatusCode.NotFound?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.Method = "HEAD"; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    return response.StatusCode; 
} 

Tuy nhiên, nếu url thực sự bị hỏng, nó sẽ không trả lời, thay vào đó là ném một ngoại lệ.

tôi sửa đổi mã của tôi như thế này:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
    request.Method = "HEAD"; 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     return response.StatusCode; 
    } 
} 
catch (System.Net.WebException ex) 
{ 
    var response = ex.Response as HttpWebResponse; 
    return response == null ? HttpStatusCode.InternalServerError : response.StatusCode; 
} 

mà dường như cuối cùng đã làm những gì tôi muốn.

Nhưng tôi muốn biết, tại sao yêu cầu lại ném ngoại lệ thay vì trả lại phản hồi bằng mã trạng thái NotFound?

Trả lời

54

Điều này có thể khá khó chịu khi các trang web sử dụng mã trạng thái nhiều và không phải tất cả đều là lỗi. Mà có thể làm cho cơ thể chế biến khá đau. Cá nhân tôi sử dụng phương pháp mở rộng này để nhận phản hồi.

public static class HttpWebResponseExt 
{ 
    public static HttpWebResponse GetResponseNoException(this HttpWebRequest req) 
    { 
     try 
     { 
      return (HttpWebResponse)req.GetResponse(); 
     } 
     catch (WebException we) 
     { 
      var resp = we.Response as HttpWebResponse; 
      if (resp == null) 
       throw; 
      return resp; 
     } 
    } 
} 
+6

Mặc dù đây là công việc ít nhất để lưu mã bằng cách sử dụng HttpWebRequest/Response từ lựa chọn thiết kế xấu này trên phần .Net Framework, giải pháp chính xác là sử dụng HttpClient, không ném mã trạng thái 4xx và 5xx. Ngoại lệ là dành cho các tình huống đặc biệt, và chỉ ném để bắt nó và tiến hành như thể nó là tốt như thế này là xấu xí và xấu cho hiệu suất, đặc biệt là có một lựa chọn tốt hơn tránh nó hoàn toàn. https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx –

+1

điều này có vẻ không đúng; Tôi đang sử dụng HttpClient trong một dự án và khi gọi một url không tồn tại trả về mã trạng thái 404, ứng dụng khách sẽ ném một ngoại lệ thay vì trả về phản hồi với mã trạng thái 404. có thêm một bước trong việc sử dụng httpclient để ngăn chặn điều này không? – SelAromDotNet

2

Tại sao không? Cả hai đều là các tùy chọn thiết kế hợp lệ và HttpWebRequest chỉ được thiết kế để hoạt động theo cách này.

+0

Miễn là bạn có thể đọc tiêu đề phản hồi và nội dung khi mã là 4xx –

+4

Tôi đoán tôi đã nhầm lẫn, vì không có mẫu mã nào tôi thấy cho điều này. nhiều người thậm chí không có một thử/bắt, và tôi đã tự hỏi nếu có lẽ tôi đã bỏ lỡ một cái gì đó và có một cách để có được tình trạng mà không ném một ngoại lệ. nó chỉ có vẻ ngược lại để ném toàn bộ ngoại lệ nếu mã trạng thái được thiết kế để xử lý trạng thái như vậy – SelAromDotNet

+1

Vâng, nó luôn dẫn đến kết quả thú vị khi bạn nghĩ rằng "tất nhiên xxx đã kiểm tra dòng mã mà anh ta đưa lên trang web của mình!" và bạn trở nên nhầm lẫn :) –

Các vấn đề liên quan