Apa perbedaan antara kelas WebClient dan HTTPWebRequest di .NET?

178

Apa perbedaan antara kelas WebClient- HttpWebRequestkelas di .NET? Mereka berdua melakukan hal yang sangat mirip. Bahkan, mengapa mereka tidak digabung menjadi satu kelas (terlalu banyak metode / variabel dll mungkin menjadi satu alasan tetapi ada kelas lain di .NET yang melanggar aturan itu).

Terima kasih.

GurdeepS
sumber

Jawaban:

242

WebClient adalah abstraksi tingkat tinggi yang dibangun di atas HttpWebRequest untuk menyederhanakan tugas yang paling umum. Misalnya, jika Anda ingin mendapatkan konten dari HttpWebResponse, Anda harus membaca dari aliran respons:

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

Dengan WebClient, Anda cukup melakukan DownloadString:

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

Catatan: Saya meninggalkan usingpernyataan dari kedua contoh untuk singkatnya. Anda harus berhati-hati untuk membuang objek permintaan web dengan benar.

Secara umum, WebClient baik untuk permintaan sederhana cepat dan kotor dan HttpWebRequest bagus untuk ketika Anda membutuhkan kontrol lebih besar atas seluruh permintaan.

John Sheehan
sumber
34
Di atas adalah fakta, berikut ini adalah pendapat: keduanya mengerikan karena HttpWebRequest rusak. Ini menangani auth dasar yang salah, memerlukan solusi aneh seperti ServicePointManager.Expect100Continue = false, melakukan hal-hal non-standar lainnya dan memiliki banyak keanehan dan kekhasan. Saya mulai RestSharp untuk membantu mengatasi masalah-masalah itu.
John Sheehan
4
Perhatikan juga bahwa WebClient adalah komponen, sehingga Anda dapat menarik / melepaskannya dari jendela alat VS ke formulir Anda dan dapat menggunakannya di sana.
Gagal
1
Saya pikir saya mencoba menggunakan httpwebrequest dengan auth dasar beberapa waktu lalu. Saya bisa menyetujuinya. Jadi, Anda membuat RestSharp? Keren!
GurdeepS
19
Siapa pun yang menemukan ini seperti yang saya miliki sekarang, perhatikan ada pemain baru di lapangan bernama HttpClientyang datang dengan .NET 4.5 yang mungkin (atau mungkin tidak?) Menyelesaikan beberapa kerepotan di atas ...
Funka
3
WebClient mengimplementasikan IDisposable, jadi sebaiknya Anda mempertimbangkan untuk melakukanusing (WebClient client = new WebClient())
Eric
32

Juga WebClient tidak memiliki properti batas waktu. Dan itu masalahnya, karena nilai dafault adalah 100 detik dan itu terlalu banyak untuk menunjukkan jika tidak ada koneksi internet.

Solusi untuk masalah itu ada di sini https://stackoverflow.com/a/3052637/1303422

Andriy F.
sumber
16
Pertanyaannya apa bedanya. Salah satu perbedaannya adalah bahwa WebClient tidak memiliki properti timeout sementara HttpWebRequest tidak.
Andriy F.
26

Saya tahu terlalu lama untuk menjawab tetapi hanya sebagai tujuan informasi untuk pembaca masa depan:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

Ini WebRequestadalah kelas dasar abstrak. Jadi Anda sebenarnya tidak menggunakannya secara langsung. Anda menggunakannya melalui kelas turunannya - HttpWebRequestdan FileWebRequest.

Anda menggunakan metode Buat WebRequestuntuk membuat turunan dari WebRequest. GetResponseStreamkembali data stream.

Ada juga FileWebRequestdan FtpWebRequestkelas yang inheritdari WebRequest. Biasanya, Anda akan menggunakan WebRequestuntuk, baik, membuat permintaan dan mengonversi pengembalian menjadi HttpWebRequest, FileWebRequestatau FtpWebRequest, tergantung pada permintaan Anda. Di bawah ini adalah contohnya:

Contoh:

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

WebClient

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

WebClientmenyediakan operasi umum ke sendingdan receivingdata dari sumber daya yang diidentifikasi oleh a URI. Sederhananya, ini adalah abstraksi level yang lebih tinggi HttpWebRequest. 'Operasi umum' ini adalah yang membedakan WebClientdari HttpWebRequest, seperti juga ditunjukkan dalam sampel di bawah ini:

Contoh:

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

Ada juga DownloadDatadan DownloadFileoperasi dalam WebClientcontoh. Operasi umum ini juga menyederhanakan kode dari apa yang biasanya kita lakukan HttpWebRequest. Dengan menggunakan HttpWebRequest, kita harus mendapatkan respons dari permintaan kita, instantiate StreamReaderuntuk membaca respons dan akhirnya, mengubah hasilnya menjadi tipe apa pun yang kita harapkan. Dengan WebClient, kami cukup menelepon DownloadData, DownloadFile or DownloadString.

Namun, perlu diingat bahwa WebClient.DownloadStringtidak mempertimbangkan encodingsumber daya yang Anda minta. Jadi, Anda mungkin pada akhirnya akan menerima karakter aneh jika Anda tidak menentukan dan menyandikan.

CATATAN: Pada dasarnya " WebClient mengambil beberapa baris kode dibandingkan dengan Webrequest "

SHEKHAR SHETE
sumber
Apakah Kelas WebClient Menggunakan Metode Post / Get ..? Tolong Berikan Tautan untuk menjelaskan
Kartiikeya
WebRequest memungkinkan kita untuk menambahkan tipe Metode Permintaan, yaitu Get / Post with METHOD properti. dimana WebClient tidak memiliki fungsionalitas jenis Metode apa pun.
SHEKHAR SHETE
1
@SHEKHARSHETE Saya dapat menggunakan webClient.UploadData(url, "POST", bytes)untuk menentukan metode (lihat dokumen MSDN ).
Jeff B