Saat membangun aplikasi dengan ASP.NET, instance class HttpClient digunakan untuk membuat permintaan HTTP. Menggunakan HttpClient mungkin tampak sederhana. Namun, beberapa masalah potensial tidak diperhatikan sampai aplikasi berada di bawah beban berat.
Masalah yang terkait dengan kelas HttpClient asli yang disediakan dalam .NET:Login hyperlink terlihat.
HttpClient, saat mengimplementasikan IDisposable, mendeklarasikan dan membuat instance dalam pernyataan using bukanlah operasi yang disukai, karenaSaat melepaskan objek HttpClient, soket yang mendasarinya tidakseketikalepaskan, yang dapat menyebabkan masalah kelelahan soket.
Masalahnya sebenarnya bukan HttpClient itu sendiri, tetapi konstruktor default HttpClient, karena membuat instance HttpMessageHandler aktual baru dengan "kelelahan soket" dan masalah perubahan DNS yang disebutkan di atas.
Membuat HttpClient secara langsung (penggunaan yang salah)
Instans objek HttpClient secara langsung, dan tambahkan menggunakan untuk menjamin panggilan ke metode Dispose, kodenya adalah sebagai berikut:
Panggil antarmuka 5 kali, kirim permintaan HTTP menggunakan HttpClient, dan periksa koneksi jaringan dengan perintah berikut:
Anda dapat melihat bahwa ketika HttpClient dirilis, koneksi antara komputer lokal dan server target adalahTIME_WAITDalam kasus konkurensi tinggi, kesalahan akan dilaporkan sebagai berikut:
Tidak dapat terhubung ke server jarak jauh
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Untuk pertanyaan, Anda juga dapat merujuk:
Buat HttpClinet dengan IHttpClientFactory (penggunaan yang benar)
Menggunakan injeksi dependensi DI IHttpClientFactory sama dengan HttpLinet, yang dibuat menggunakan IHttpClientFactory.
Tambahkan layanan ke file Startup, kodenya adalah sebagai berikut:
Kode pengontrol HomeController adalah sebagai berikut:
Kami juga menggunakan HttpClinet untuk mengirim 5 permintaan melalui antarmuka panggilan, dan mesin hanya membuat koneksi dengan server target, dan koneksi digunakan kembali selama proses permintaan. Seperti yang ditunjukkan di bawah ini:
IHttpClientFactory mengumpulkan instans HttpMessageHandler yang dibuat pabrik ke dalam kumpulan untuk mengurangi konsumsi sumber daya. Saat Anda membuat instans HttpClient baru, Anda dapat menggunakan kembali instans HttpMessageHandler di kumpulan jika masa pakai belum kedaluwarsa.
{ "Seumur hidup": "Singleton", "ServiceType": "System.Net.Http.IHttpClientFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" }, { "Seumur hidup": "Singleton", "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory", "ImplementationType": "Microsoft.Extensions.Http.DefaultHttpClientFactory" } IHttpClientFactory diimplementasikan secara default sebagai DefaultHttpClientFactory, dengan alamat kode sumber:Login hyperlink terlihat.
Dengan menggunakan IHttpClientFactory dalam aplikasi yang mendukung DI, Anda dapat menghindari:
- Selesaikan masalah kelelahan sumber daya dengan membagikan instans HttpMessageHandler.
- Selesaikan kedaluwarsa DNS dengan mengulangi instans HttpMessageHandler secara berkala.
Selain itu, ada cara lain untuk memecahkan masalah di atas menggunakan instans SocketsHttpHandler yang tahan lama.
- Buat instans SocketsHttpHandler saat startup aplikasi dan gunakan di seluruh siklus hidup aplikasi.
- Konfigurasikan PooledConnectionLifetime ke nilai yang sesuai berdasarkan waktu refresh DNS.
- Buat instans HttpClient menggunakan HttpClient baru (handler, disposeHandler: false) sesuai kebutuhan.
Pendekatan di atas memecahkan masalah manajemen sumber daya dengan cara yang mirip dengan IHttpClientFactory.
- SocketsHttpHandler antara instans HttpClientKoneksi bersama。 Berbagi ini mencegah kelelahan soket.
- SocketsHttpHandler mengulang koneksi berdasarkan PooledConnectionLifetime untuk menghindari kedaluwarsa DNS.
Untuk penggunaan dan konfigurasi lebih lanjut, silakan lihat:
Login hyperlink terlihat.
Login hyperlink terlihat.
|