Câu trả lời:
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 using
tuyê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.
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 ...
using (WebClient client = new WebClient())
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
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 WebRequest
là 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 - HttpWebRequest
và FileWebRequest
.
Bạn sử dụng phương thức Tạo WebRequest
để tạo một thể hiện của WebRequest
. GetResponseStream
trả lại data stream
.
Ngoài ra còn có FileWebRequest
và FtpWebRequest
các lớp học inherit
từ 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
, FileWebRequest
hoặ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
WebClient
cung cấp các hoạt động chung sending
và receiving
dữ 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 WebClient
từ 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ó DownloadData
và DownloadFile
hoạt động theo WebClient
ví 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.DownloadString
không xem xét encoding
tà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 "
webClient.UploadData(url, "POST", bytes)
để chỉ định phương thức (xem tài liệu MSDN ).
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 đề đó.