Có gì khác biệt giữa các lớp WebClient và HTTPWebRequest trong .NET?


178

Có gì khác nhau giữa WebClientcác HttpWebRequestlớp và .NET? Cả hai đều làm những việc rất giống nhau. Trong thực tế, tại sao chúng không hợp nhất thành một lớp (quá nhiều phương thức / biến, v.v. có thể là một lý do nhưng có các lớp khác trong .NET phá vỡ quy tắc đó).

Cảm ơn.

Câu trả lời:


242

WebClient là một bản tóm tắt cấp cao hơn được xây dựng dựa trên httpWebRequest để đơn giản hóa các tác vụ phổ biến nhất. Chẳng hạn, nếu bạn muốn lấy nội dung ra khỏi một httpWebResponse, bạn phải đọc từ luồng phản hồi:

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

Với WebClient, bạn chỉ cần làm DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

Lưu ý: Tôi đã bỏ qua các usingtuyên bố từ cả hai ví dụ cho ngắn gọn. Bạn chắc chắn nên cẩn thận để xử lý các đối tượng yêu cầu web của bạn đúng cách.

Nói chung, WebClient tốt cho các yêu cầu đơn giản nhanh chóng và bẩn thỉu và HttpWebRequest phù hợp khi bạn cần kiểm soát nhiều hơn đối với toàn bộ yêu cầu.


34
Trên đây là thực tế, sau đây là ý kiến: cả hai đều khủng khiếp vì httpWebRequest bị hỏng. Nó xử lý auth cơ bản sai, yêu cầu cách giải quyết kỳ lạ như ServicePointManager.Expect100Continue = false, làm những việc không chuẩn khác và có nhiều điều kỳ quặc và bình dị. Tôi bắt đầu RestSharp để giúp giải quyết những vấn đề đó.
John Sheehan

4
Cũng lưu ý rằng WebClient là một thành phần, vì vậy bạn có thể kéo / thả nó từ cửa sổ công cụ VS vào biểu mẫu của mình và có thể sử dụng nó ở đó.
feroze

1
Tôi nghĩ rằng tôi đã thử sử dụng httpwebrequest với auth cơ bản một thời gian trước đây. Tôi có thể đồng ý với điều đó. Vậy bạn đã làm RestSharp? Mát mẻ!
GurdeepS

19
Bất cứ ai gặp phải điều này giống như tôi vừa nãy, lưu ý rằng có một người chơi mới trên lĩnh vực được gọi là HttpClient.NET 4.5 có thể (hoặc có thể không?) Giải quyết một số rắc rối ở trên ...
Funka

3
WebClient triển khai IDis Dùng một lần, vì vậy bạn nên xem xét thực hiệnusing (WebClient client = new WebClient())
Eric

32

Ngoài ra WebClient không có thời gian chờ. Và đó là vấn đề, bởi vì giá trị dafault là 100 giây và đó là quá nhiều để chỉ ra nếu không có kết nối Internet.

Giải pháp cho vấn đề đó là ở đây https://stackoverflow.com/a/3052637/1303422


16
Câu hỏi là sự khác biệt. Một trong những điểm khác biệt là WebClient không có thuộc tính hết thời gian chờ trong khi HttpWebRequest thì có.
Andriy F.

26

Tôi biết quá lâu để trả lời nhưng chỉ là mục đích thông tin cho độc giả tương lai:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

Đây WebRequestlà một lớp cơ sở trừu tượng. Vì vậy, bạn thực sự không sử dụng nó trực tiếp. Bạn sử dụng nó thông qua các lớp dẫn xuất - HttpWebRequestFileWebRequest.

Bạn sử dụng phương thức Tạo WebRequestđể tạo một thể hiện của WebRequest. GetResponseStreamtrả lại data stream.

Ngoài ra còn có FileWebRequestFtpWebRequestcác lớp học inherittừ WebRequest. Thông thường, bạn sẽ sử dụng WebRequestđể, thực hiện một yêu cầu và chuyển đổi trả lại thành HttpWebRequest, FileWebRequesthoặc FtpWebRequest, tùy thuộc vào yêu cầu của bạn. Dưới đây là một ví dụ:

Thí dụ:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientcung cấp các hoạt động chung sendingreceivingdữ liệu từ một tài nguyên được xác định bởi a URI. Đơn giản, đó là một sự trừu tượng hóa ở cấp độ cao hơn HttpWebRequest. Đây 'thao tác thông thường' là những gì phân biệt WebClienttừ HttpWebRequest, cũng như thể hiện trong các mẫu dưới đây:

Thí dụ:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

Ngoài ra còn có DownloadDataDownloadFilehoạt động theo WebClientví dụ. Các hoạt động phổ biến này cũng đơn giản hóa mã của những gì chúng ta thường làm với HttpWebRequest. Sử dụng HttpWebRequest, chúng tôi phải nhận được phản hồi của yêu cầu của chúng tôi, khởi tạo StreamReaderđể đọc phản hồi và cuối cùng, chuyển đổi kết quả thành bất kỳ loại nào chúng tôi mong đợi. Với WebClient, chúng tôi chỉ đơn giản là gọi DownloadData, DownloadFile or DownloadString.

Tuy nhiên, hãy nhớ rằng WebClient.DownloadStringkhông xem xét encodingtài nguyên bạn yêu cầu. Vì vậy, có lẽ bạn sẽ nhận được các ký tự lạ nếu bạn không chỉ định và mã hóa.

LƯU Ý: Về cơ bản " WebClient mất vài dòng mã so với Webrequest "


Lớp WebClient có sử dụng phương thức Post / Get .. không? Vui lòng cung cấp một liên kết để mô tả
Kartiikeya

WebRequest cho phép chúng tôi thêm loại Phương thức yêu cầu, tức là Nhận / Đăng với một PHƯƠNG PHÁP thuộc tính. như WebClient không có chức năng thêm kiểu Phương thức.
CHIA SẺ SHEKHAR

1
@SHEKHARSHETE Tôi đã có thể sử dụng webClient.UploadData(url, "POST", bytes)để chỉ định phương thức (xem tài liệu MSDN ).
Jeff B
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.