.Net Core HttpClientFactory untuk Beberapa Layanan API
Saya punya proyek .Net Core yang perlu terhubung ke sekitar 4 layanan API yang berbeda, saya bukan ahli dengan kode HttpClient mana pun, tetapi dari apa yang saya temukan, adalah Anda biasanya hanya ingin menggunakan kembali satu contoh dari HttpClient Anda. Dari apa yang saya dapat katakan, konsensus umum adalah menggunakan HttpClientFactory di .Net Core dengan mendaftarkannya di kelas Startup Anda dan kemudian memintanya menggunakan DI.
Sekarang sebagian besar header default saya dan yang semacamnya umumnya sama di samping url BaseAddress, bagaimana saya harus melakukan hal ini saat menghubungkan ke layanan 4 API berbeda? Haruskah saya mendaftarkan 4 klien bernama berbeda atau memiliki satu klien dengan semua informasi default yang telah ditentukan sebelumnya dan kemudian secara manual mengkonfigurasinya sesuai kebutuhan, misalnya mengkonfigurasi alamat?
Pertanyaan umum adalah karena saya cukup baru dalam hal ini, telah dikatakan untuk menggunakan kembali satu contoh HttpClient.
- Jika saya membuat 4 klien bernama berbeda untuk setiap layanan API, bukankah ini akan membuat 4 instance HttpClient ketika saya memanggil metode .CreateClient ()?
- .CreateClient () membuat instance baru setiap kali dipanggil, bukankah ini mengalahkan tujuan memiliki satu instance HttpClient jika mengatakan saya perlu melakukan 3 panggilan berbeda ke satu layanan API, masing-masing panggilan tersebut akan memanggil a. CreateClient () untuk membuat semacam koneksi dan itu akan membuat 3 instance HttpClient?
Setiap bantuan untuk kejelasan akan dihargai,
Terima kasih!
Jawaban
Tujuan penggunaan IHttpClientFactorybukan untuk menggunakan kembali instance HttpClient. Sebaliknya, ini adalah untuk menggunakan kembali (dengan menggabungkan) contoh HttpMessageHandler(sebenarnya HttpClientHandler, yang berasal dari abstrak HttpMessageHandler) yang merupakan objek yang mendasari yang mengelola koneksi & soket HTTP. Diagram dari Microsoft Docs ini menunjukkannya dengan baik.
Anda khawatir bahwa sering menelepon ke IHttpClientFactory.CreateClient()akan menimbulkan masalah yang sama seperti sering menelepon new HttpClient(). Namun, bukan itu masalahnya. Seperti yang dijelaskan oleh dokumen Microsoft , alasan bahwa seringnya panggilan ke new HttpClient()mengakibatkan kehabisan soket adalah karena konstruktor ini akan membuat instance baru dari HttpMessageHandler:
Namun, masalahnya tidak benar-benar dengan HttpClient itu sendiri, tetapi dengan konstruktor default untuk HttpClient, karena ini membuat instance konkret baru dari HttpMessageHandler, yang memiliki masalah kehabisan soket dan perubahan DNS yang disebutkan di atas.
Anda dapat melihat dari kode sumber dari IHttpClientFactoryyang tidak menggunakan konstruktor parameterless dari HttpClientdalam CreateClient(). Sebagai gantinya, ia mendapatkan HttpMessageHandlerdari kolam dan menyuntikkannya ke dalam yang dibuat HttpClient.
Baik Anda menggunakan klien yang diketik atau bernama, Anda harus menggunakan instance HttpClient seolah-olah itu adalah objek sementara: pembuatannya murah dan Anda tidak perlu menyimpannya dalam cache untuk jangka waktu yang lama.