WebClient so với httpWebRequest / HttpWebResponse


132

Dường như với tôi rằng hầu hết những gì có thể được hoàn thành HttpWebRequest/Responsecũng có thể được hoàn thành với WebClientlớp. Tôi đọc ở đâu đó WebClientlà một trình bao bọc cấp cao cho WebRequest/Response.
Cho đến nay, tôi không thể thấy bất cứ điều gì có thể được thực hiện HttpWebRequest/Responsemà không thể thực hiện được WebClient, cũng như nơi httpWebRequest / Feedback sẽ cung cấp cho bạn quyền kiểm soát "chi tiết hơn".

Khi nào tôi nên sử dụng WebClient và khi HttpWebRequest/Responsenào? (Rõ ràng, HttpWebRequest/Responselà cụ thể HTTP.)

Nếu HttpWebRequest/Responseở cấp độ thấp hơn thì WebClienttôi có thể hoàn thành cái gì HttpWebRequest/Responsemà tôi không thể hoàn thành WebClient?

Câu trả lời:


87

Sử dụng HttpWebRequestcho phép bạn kiểm soát nhiều hơn theo yêu cầu. Bạn có thể đặt cookie, tiêu đề, giao thức, v.v ... Trong phản hồi, bạn cũng có thể truy xuất cookie và tiêu đề


14
Thomas, vẫn chưa bị thuyết phục ... WebClient có thuộc tính Headers, bạn có thể truy xuất cookie như thế này: String cookie = webClient.ResponseHeaders (Hồi Set-Cookie,) và đặt nó: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie từ ");
Dan

14
Sử dụng HttpWebRequest, bạn có thể xác định thời gian chờ. Trong WebClient, điều đó là không thể.
ripper234

14
@ ripper234, thực tế có thể: bạn chỉ cần kế thừa WebClient và ghi đè GetWebRequest để tùy chỉnh httpWebRequest
Thomas Levesque

15
@ThomasLevesque nếu bạn đang kế thừa webclient và ghi đè lên webrequest, có vẻ như vô nghĩa khi sử dụng webclient ...
Hagai L

5
@HagaiL, tôi không đồng ý ... Bạn không phải tạo toàn bộ yêu cầu theo cách thủ công, bạn có thể sử dụng base.GetWebRequestđể tạo yêu cầu và sau đó tùy chỉnh những gì bạn muốn
Thomas Levesque

54

HttpWebRequest hiển thị nhiều nội dung hơn cho phép bạn kiểm soát giao thức chi tiết, ví dụ: bạn có muốn sử dụng Keep-Alive hay không, sử dụng nhóm kết nối nào, có nên ghi đệm hay không, v.v.

WebClientkhông để lộ tất cả những thứ đó (mặc dù bạn có thể phân lớp từ WebClientvà getaccess sang đối tượng Request bên dưới).

WebClientrất hữu ích đối với những tình huống mà bạn chỉ muốn làm một hoạt động (ví dụ: POST / GET / Form tải lên) và không thể bị làm phiền để tạo và quản lý HttpWebRequest, RequestStream, HttpWebResponse, và dòng phản ứng.


13
Ngoài ra, có một điều nữa mà tôi quên đề cập. WebClient là một đối tượng Thành phần, trong khi đó httpWebRequest thì không. Điều đó nghĩa là gì? Chà, nếu bạn đang sử dụng VisualStudio để xây dựng một ứng dụng GUI, thì bạn có thể kéo / thả thành phần WebClient trên biểu mẫu của mình và sử dụng nó để đưa ra yêu cầu cho các máy chủ HTTP / FTP, v.v.
feroze

14

Từ blog của Tim Heuler - http://timheuer.com/blog/archive/2008/03/14/calling-web-service-with-silverlight-2.aspx

Thay vào đó, trong Silverlight, bạn sẽ muốn sử dụng WebClient hoặc HttpWebRequest. Có gì khác biệt? Đây là phiên bản timheuer. WebClient là một triển khai đơn giản hơn, thực hiện các yêu cầu GET thực sự dễ dàng và nhận được luồng phản hồi. HttpWebRequest rất phù hợp khi bạn cần kiểm soát chi tiết hơn một chút đối với yêu cầu, cần gửi tiêu đề hoặc các tùy chỉnh khác.


7
WebClient cũng cho phép POST, với UploadString, UploadData và UploadFile
Thomas Levesque

@ThomasLevesque Hôm nay có phiên bản mới hơn của các lớp không? Tôi thấy rằng cuộc thảo luận này là một chút, hmm ... tuổi ...
Konrad Viltersten

@KonradViltersten, tôi không nghĩ đã có nhiều thay đổi đối với lớp WebClient. Đối với các ứng dụng mới, tôi khuyên bạn nên sử dụng HttpClient, điều này cũng rất dễ sử dụng và linh hoạt hơn nhiều.
Thomas Levesque

1
@ThomasLevesque Phải, đó là người tôi đã nghĩ đến. Tôi nhớ lại http là sự khác biệt trong tên lớp và bị đánh lừa bởi phần .... Bây giờ tôi đang đi đúng hướng. Cảm ơn!
Konrad Viltersten

12

Lớp WebClient chạy trên luồng giao diện người dùng, vì vậy giao diện người dùng không phản hồi trong khi dữ liệu đang được tải xuống từ Internet. Mặt khác, lớp HttpWebRequest không chặn luồng giao diện người dùng và ứng dụng của bạn phản hồi nhanh. Vì vậy, trong các ứng dụng có tải xuống một lượng lớn dữ liệu từ Internet hoặc nếu nguồn dữ liệu chậm truy cập, bạn nên sử dụng lớp HttpWebRequest; trong tất cả các trường hợp khác, bạn nên sử dụng lớp WebClient.


1
Điều ngược lại là đúng trên WP7. Các soái ca httpWebRequest trở lại chuỗi UI trong Mango, khiến tôi không hết đau buồn ngay bây giờ. Grrr
Cameron MacFarland

6
WebClient cũng hỗ trợ các phương thức không đồng bộ.
CyberMonk

6

Một nhược điểm khác WebClientlà nó bỏ qua giá trị ContentTypecủa HTTP charsetkhi bạn sử dụng nó để nhận văn bản phản hồi. Bạn phải đặt mã hóa rõ ràng thông qua thuộc Encodingtính.


Đây là một quan điểm tốt; và đó không chỉ là vấn đề cài đặt Encoding- bạn không thể biết mã hóa cho đến sau khi yêu cầu, do đó, api WebClient khiến bạn rất khó có thể tải xuống một chuỗi trong một mã hóa không xác định.
Eamon Nerbonne

5

Một điều nữa là httpWebrquest cho phép bạn nén nhưng lớp Net.WebClient không hỗ trợ nén HTTP


3
Cũng giống như tất cả các ví dụ khác về WebClient ẩn một số chi tiết, điều này có thể được khắc phục bằng cách phân lớp WebClient và ghi đè GetWebRequest. Trong trường hợp này, bạn chỉ cần chỉnh cơ bản HttpWebRequest.AutomaticDecompressiongtài sản ).
patridge

5

"HtttpWebRequest" đã lỗi thời trong .NET 4.5. Bây giờ, lớp này chỉ là nội bộ.


2
Thật. Sử dụng WebRequestthay thế.
tằm lửa

2
Các lớp không lỗi thời, các nhà xây dựng là. Và lớp học không phải là nội bộ, nó vẫn là công khai.
dùng247702

2

Một ví dụ: Đăng dữ liệu và nhận lại dữ liệu đã xử lý trong một chu kỳ yêu cầu / phản hồi dường như là không thể với WebClient, nhưng bạn có thể làm điều đó với HtttpWebRequest.


2
Chỉ cần sử dụng WebClient.UploadString hoặc WebClient.UploadData để thực hiện POST và lấy lại chuỗi phản hồi hoặc mảng byte.
samjudson

2
Để làm rõ, giá trị trả về của UploadString là một chuỗi và giá trị trả về của phương thức UploadData là một mảng byte.
Norman H
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.