Kapan menggunakan WebClient vs. HttpClient vs. HttpWebRequest

Anda memiliki tiga pilihan berbeda untuk menggunakan REST API saat bekerja di .NET Framework: WebClient, HttpClient, dan HttpWebRequest. Dalam posting ini kita akan melihat tiga cara ini kita dapat mengakses REST API dari dalam lingkungan yang dikelola, yaitu tanpa menggunakan pustaka pihak ketiga. Pada bagian selanjutnya, saya akan mengilustrasikan pendekatan ini dengan contoh kode yang relevan untuk membantu Anda mendapatkan pemahaman yang lebih baik tentang konsep.

Singkatnya, WebRequest — dalam implementasi khusus HTTP-nya, HttpWebRequest — mewakili cara asli untuk menggunakan permintaan HTTP dalam .NET Framework. WebClient menyediakan pembungkus sederhana namun terbatas di sekitar HttpWebRequest. Dan HttpClient adalah cara baru dan lebih baik untuk melakukan permintaan dan kiriman HTTP, setelah hadir dengan .NET Framework 4.5.

Mari kita mulai diskusi kita dengan kelas abstrak WebRequest.

System.Net.WebRequest

Kelas System.Net.WebRequest adalah kelas abstrak. Jadi, Anda perlu membuat HttpWebRequest atau FileWebRequest untuk menggunakan permintaan HTTP menggunakan kelas ini. Cuplikan kode berikut menunjukkan bagaimana Anda dapat bekerja dengan WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse ();

System.Net.HttpWebRequest

WebRequest adalah kelas pertama yang disediakan di .NET Framework untuk menggunakan permintaan HTTP. Ini memberi Anda banyak fleksibilitas dalam menangani setiap aspek objek permintaan dan respons, tanpa memblokir utas antarmuka pengguna. Anda dapat menggunakan kelas ini untuk mengakses dan bekerja dengan header, cookie, protokol, dan waktu tunggu saat bekerja dengan HTTP. Potongan kode berikut menggambarkan bagaimana HttpWebRequest dapat digunakan.

HttpWebRequest http = HttpWebRequest) WebRequest.Create (“// localhost: 8900 / api / default”);

Tanggapan WebResponse = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = StreamReader baru (memoryStream);

string data = streamReader.ReadToEnd ();

Anda dapat menemukan dokumentasi Microsoft di HttpWebRequest di sini. 

System.Net.WebClient

Kelas System.Net.WebClient di .NET menyediakan abstraksi tingkat tinggi di atas HttpWebRequest. WebClient hanyalah pembungkus di sekitar HttpWebRequest, jadi gunakan HttpWebRequest secara internal. Karenanya, WebClient agak lambat dibandingkan dengan HttpWebRequest, tetapi mengharuskan Anda untuk menulis lebih sedikit kode. Anda dapat menggunakan WebClient untuk mengetahui cara sederhana untuk terhubung ke dan bekerja dengan layanan HTTP. Ini umumnya merupakan pilihan yang lebih baik daripada HttpWebRequest kecuali Anda perlu memanfaatkan fitur tambahan yang disediakan HttpWebRequest. Cuplikan kode berikut menunjukkan bagaimana Anda dapat bekerja dengan WebClient.

data string = null;

menggunakan (var webClient = new WebClient ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient diperkenalkan di .NET Framework 4.5. Untuk pengembang yang menggunakan .NET 4.5 atau lebih baru, ini adalah cara yang disukai untuk menggunakan permintaan HTTP kecuali Anda memiliki alasan khusus untuk tidak menggunakannya. Intinya, HttpClient menggabungkan fleksibilitas HttpWebRequest dan kesederhanaan WebClient, memberi Anda yang terbaik dari kedua dunia.

Kelas HttpWebRequest menyediakan banyak kontrol atas objek permintaan / respons. Namun, Anda harus menyadari bahwa HttpClient tidak pernah dirancang untuk menjadi pengganti WebClient. Anda harus menggunakan HttpWebRequest daripada HttpClient setiap kali Anda membutuhkan fitur tambahan yang disediakan HttpWebRequest. Lebih lanjut, tidak seperti WebClient, HttpClient tidak memiliki dukungan untuk pelaporan kemajuan dan skema URI kustom. 

Meskipun HttpClient tidak mendukung FTP, mengejek dan menguji HttpClient lebih mudah. Semua metode terikat I / O di HttpClient bersifat asinkron, dan Anda juga dapat menggunakan instance HttpClient yang sama untuk membuat permintaan bersamaan. Potongan kode berikut menggambarkan bagaimana Anda bisa bekerja dengan HttpClient.

public async Tugas GetAuthorsAsync (string uri)

{

    Penulis penulis = null;

    HttpResponseMessage response = menunggu client.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        author = await response.Content.ReadAsAsync ();

    }

    penulis kembali;

}

Perhatikan bahwa ketika ada kesalahan dalam respons, HttpClient tidak menampilkan kesalahan. Sebaliknya, ini menetapkan IsSuccessStatusCodeproperti ke false. Jika Anda ingin menampilkan pengecualian jika IsSuccessStatusCodepropertinya salah, Anda dapat memanggil EnsureSuccessStatusCodemetode tersebut pada instance respons seperti yang ditunjukkan di bawah ini.

response.EnsureSuccessStatusCode ();

HttpClient dirancang untuk dibuat instance-nya satu kali dan digunakan kembali sepanjang siklus hidup aplikasi — Anda tidak boleh membuat instance HttpClient baru untuk setiap permintaan yang perlu diproses aplikasi Anda. Jika Anda melakukannya, soket yang tersedia dapat menjadi habis karena lalu lintas padat, yang mengakibatkan  SocketExceptionkesalahan. Praktik yang direkomendasikan adalah membuat satu instance HttpClient bersama.