Bila hendak menggunakan WebClient vs. HttpClient vs. HttpWebRequest

Anda mempunyai tiga pilihan yang berbeza untuk menggunakan REST API ketika bekerja di .NET Framework: WebClient, HttpClient, dan HttpWebRequest. Dalam catatan ini kita akan melihat tiga cara ini untuk mengakses API REST dari dalam lingkungan yang dikendalikan, iaitu, tanpa menggunakan perpustakaan pihak ketiga. Pada bahagian yang berikut saya akan menggambarkan pendekatan ini dengan contoh kod yang relevan untuk membantu anda memperoleh pemahaman yang lebih baik mengenai konsep.

Ringkasnya, WebRequest — dalam pelaksanaan khusus HTTP, HttpWebRequest — mewakili cara asli untuk menggunakan permintaan HTTP dalam .NET Framework. WebClient menyediakan pembungkus ringkas tetapi terhad di sekitar HttpWebRequest. Dan HttpClient adalah cara baru dan lebih baik untuk melakukan permintaan dan siaran HTTP, setelah tiba dengan .NET Framework 4.5.

Mari mulakan perbincangan kami dengan kelas abstrak WebRequest.

Sistem.Net.WebRequest

Kelas System.Net.WebRequest adalah kelas abstrak. Oleh itu, anda perlu membuat HttpWebRequest atau FileWebRequest untuk menggunakan permintaan HTTP menggunakan kelas ini. Coretan kod berikut menunjukkan bagaimana anda boleh bekerja dengan WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Mode;

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

System.Net.HttpWebRequest

WebRequest adalah kelas pertama yang disediakan dalam .NET Framework untuk menggunakan permintaan HTTP. Ini memberi anda banyak kelonggaran dalam menangani setiap aspek objek permintaan dan respons, tanpa menyekat utas antara muka pengguna. Anda boleh menggunakan kelas ini untuk mengakses dan bekerja dengan tajuk, kuki, protokol, dan waktu tamat ketika bekerja dengan HTTP. Coretan kod berikut menggambarkan bagaimana HttpWebRequest dapat digunakan.

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

Respons WebResponse = http.GetResponse ();

MemoryStream memoryStream = tindak balas.GetResponseStream ();

StreamReader streamReader = StreamReader baru (memoryStream);

data rentetan = streamReader.ReadToEnd ();

Anda boleh mendapatkan dokumentasi Microsoft di HttpWebRequest di sini. 

Sistem.Net.WebClient

Kelas System.Net.WebClient di .NET memberikan abstraksi tahap tinggi di atas HttpWebRequest. WebClient hanyalah pembungkus HttpWebRequest, jadi menggunakan HttpWebRequest secara dalaman. Oleh itu, WebClient agak perlahan berbanding dengan HttpWebRequest, tetapi memerlukan anda menulis lebih kurang kod. Anda boleh menggunakan WebClient untuk cara mudah untuk berhubung dan bekerja dengan perkhidmatan HTTP. Secara amnya, ini adalah pilihan yang lebih baik daripada HttpWebRequest melainkan anda perlu memanfaatkan ciri tambahan yang disediakan oleh HttpWebRequest. Coretan kod berikut menunjukkan bagaimana anda boleh bekerja dengan WebClient.

data rentetan = null;

menggunakan (var webClient = WebClient baru ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient diperkenalkan dalam .NET Framework 4.5. Bagi pembangun yang menggunakan .NET 4.5 atau lebih baru, adalah cara yang lebih disukai untuk menggunakan permintaan HTTP melainkan anda mempunyai alasan tertentu untuk tidak menggunakannya. Pada hakikatnya, HttpClient menggabungkan fleksibiliti HttpWebRequest dan kesederhanaan WebClient, memberikan yang terbaik dari kedua dunia.

Kelas HttpWebRequest memberikan banyak kawalan terhadap objek permintaan / respons. Namun, anda harus sedar bahawa HttpClient tidak pernah dirancang untuk menjadi pengganti WebClient. Anda harus menggunakan HttpWebRequest dan bukannya HttpClient setiap kali anda memerlukan ciri tambahan yang disediakan oleh HttpWebRequest. Selanjutnya, tidak seperti WebClient, HttpClient kekurangan sokongan untuk pelaporan kemajuan dan skema URI tersuai. 

Walaupun HttpClient tidak menyokong FTP, mengejek dan menguji HttpClient lebih mudah. Semua kaedah terikat I / O dalam HttpClient tidak segerak, dan anda boleh menggunakan contoh HttpClient yang sama untuk membuat permintaan serentak juga. Coretan kod berikut menggambarkan bagaimana anda boleh bekerja dengan HttpClient.

async awam Tugas GetAuthorsAsync (uri rentetan)

{

    Pengarang pengarang = null;

    Tindak balas HttpResponseMessage = tunggu pelanggan.GetAsync (uri);

    jika (tindak balas.IsSuccessStatusCode)

    {

        pengarang = tunggu tindak balas.Konten.ReadAsAsync ();

    }

    pengarang kembali;

}

Perhatikan bahawa apabila terdapat kesalahan dalam tindak balas, HttpClient tidak membuang kesalahan. Sebaliknya, ia menetapkan IsSuccessStatusCodeharta benda menjadi palsu. Sekiranya anda ingin membuang pengecualian jika IsSuccessStatusCodeharta itu palsu, anda boleh membuat panggilan ke EnsureSuccessStatusCodekaedah pada contoh respons seperti yang ditunjukkan di bawah.

tindak balas.EnsureSuccessStatusCode ();

HttpClient dirancang untuk dibuat instan sekali dan digunakan kembali sepanjang siklus hidup aplikasi — anda tidak boleh membuat instance HttpClient baru untuk setiap permintaan yang perlu diproses oleh aplikasi anda. Sekiranya anda melakukannya, soket yang tersedia mungkin habis oleh lalu lintas yang padat, yang mengakibatkan  SocketExceptionkesilapan. Amalan yang disyorkan adalah membuat satu contoh HttpClient yang dikongsi.