Saya sedang membangun perpustakaan kelas untuk berinteraksi dengan API. Saya perlu memanggil API dan memproses respons XML. Saya dapat melihat manfaat dari menggunakan HttpClient
untuk konektivitas Asynchronous, tetapi apa yang saya lakukan adalah murni sinkron, jadi saya tidak dapat melihat manfaat signifikan dari penggunaan HttpWebRequest
.
Jika ada yang bisa menjelaskan, saya akan sangat menghargainya. Saya bukan orang yang menggunakan teknologi baru untuk itu.
c#
asp.net
dotnet-httpclient
Saus tomat
sumber
sumber
Jawaban:
Anda dapat menggunakan
HttpClient
untuk permintaan sinkron:Sejauh mengapa Anda harus menggunakan
HttpClient
lebih dariWebRequest
yang bersangkutan, yah,HttpClient
adalah anak baru di blok dan bisa berisi perbaikan lebih dari klien lama.sumber
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;
jika Anda harus membuat ini sinkron.Task.Run
menjalankan tugas dari ThreadPool, tetapi Anda memintanya.Result
untuk membunuh semua manfaat dari ini dan memblokir utas yang Anda panggil ini.Result
(yang biasanya merupakan utas UI utama)..Result
seperti ini dapat menghabiskan threadpool dan menyebabkan kebuntuan.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
Saya akan mengulangi jawaban Donny V. dan Josh
(dan tersanjung jika saya memiliki reputasi.)
Saya tidak dapat mengingat kapan terakhir kali, saya bersyukur atas fakta bahwa HttpWebRequest melemparkan pengecualian untuk kode status> = 400. Untuk mengatasi masalah ini, Anda perlu segera menangkap pengecualian, dan memetakannya ke beberapa mekanisme respons non-pengecualian dalam kode Anda ... membosankan, membosankan dan rawan kesalahan itu sendiri. Apakah itu berkomunikasi dengan database, atau menerapkan proxy web yang dipesan lebih dahulu, 'hampir' selalu diinginkan bahwa driver Http hanya memberi tahu kode aplikasi Anda apa yang dikembalikan, dan menyerahkan kepada Anda untuk memutuskan bagaimana berperilaku.
Karenanya HttpClient lebih disukai.
sumber
HttpClient
itu sendiri adalah pembungkusHttpWebRequest
(yang memang, secara internal menangkapWebException
objek - objek dan melakukan konversiHttpResponseMessage
untuk Anda). Saya akan berpikir akan lebih mudah untuk membangun klien baru sepenuhnya dari awal.Jika Anda sedang membangun perpustakaan kelas, maka mungkin pengguna perpustakaan Anda ingin menggunakan perpustakaan Anda secara tidak sinkron. Saya pikir itu alasan terbesar di sana.
Anda juga tidak tahu bagaimana perpustakaan Anda akan digunakan. Mungkin pengguna akan memproses banyak dan banyak permintaan, dan melakukannya secara tidak sinkron akan membantu kinerjanya lebih cepat dan lebih efisien.
Jika Anda dapat melakukannya dengan sederhana, cobalah untuk tidak membebani pengguna perpustakaan Anda mencoba membuat aliran asinkron ketika Anda bisa mengurusnya untuk mereka.
Satu-satunya alasan saya tidak akan menggunakan versi async adalah jika saya mencoba untuk mendukung versi .NET yang lebih lama yang belum memiliki dukungan async.
sumber
Dalam kasus saya, jawaban yang diterima tidak berhasil. Saya menelepon API dari aplikasi MVC yang tidak memiliki tindakan async.
Beginilah cara saya membuatnya berfungsi:
Lalu saya menyebutnya seperti ini:
sumber
Kemudian
jika Anda menggunakan kelas itu melewati metode async Anda sebagai parameter Anda dapat memanggil metode async dari metode sinkronisasi dengan cara yang aman.
dijelaskan di sini: https://cpratt.co/async-tips-tricks/
sumber
Semua jawaban tampaknya berfokus pada penggunaan secara
HttpClient
sinkron alih-alih memberikan jawaban aktual untuk pertanyaan.HttpClient
lebih dari sekadar penangan request / response sehingga dapat menangani beberapa kekhasan jaringan yang berbeda. Yaitu dalam kasus saya bekerja dengan proksi NTLM yang membutuhkan negosiasi, mengirim beberapa permintaan / tanggapan dengan token dan kredensial antara klien dan server proxy untuk mengotentikasi.HttpClient
(MenggunakanHttpClientHandler
) tampaknya memiliki mekanisme bawaan yang menangani yang mengembalikan sumber daya di luar proxy dengan satu pemanggilan metode.sumber