Panduan untuk menggunakan HttpClient
Kelas System.Net.Http.HttpClient mengirim permintaan HTTP dan menerima respons HTTP dari sumber daya yang diidentifikasi oleh URI. Instans HttpClient adalah kumpulan pengaturan yang diterapkan ke semua permintaan yang dijalankan oleh instans tersebut, dan setiap instans menggunakan kumpulan koneksinya sendiri, yang mengisolasi permintaannya dari yang lain. Mulai dari .NET Core 2.1, SocketsHttpHandler kelas menyediakan implementasi, membuat perilaku konsisten di semua platform.
Perilaku DNS
HttpClient hanya menyelesaikan entri DNS saat koneksi dibuat. Ini tidak melacak durasi hidup (TTL) yang ditentukan oleh server DNS. Jika entri DNS berubah secara teratur, yang dapat terjadi dalam beberapa skenario, klien tidak akan menghormati pembaruan tersebut. Untuk mengatasi masalah ini, Anda dapat membatasi masa pakai koneksi dengan mengatur PooledConnectionLifetime properti, sehingga pencarian DNS diulang saat koneksi diganti. Pertimbangkan contoh berikut:
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);
Sebelumnya dikonfigurasi HttpClient
untuk menggunakan kembali koneksi selama 15 menit. Setelah rentang waktu yang ditentukan oleh PooledConnectionLifetime telah berlalu, koneksi ditutup dan yang baru dibuat.
Koneksi terkumpul
Kumpulan koneksi untuk HttpClient ditautkan ke yang mendasar SocketsHttpHandler. HttpClient Ketika instans dibuang, instans membuang semua koneksi yang ada di dalam kumpulan. Jika nanti Anda mengirim permintaan ke server yang sama, koneksi baru harus dibuat ulang. Akibatnya, ada hukuman performa untuk pembuatan koneksi yang tidak perlu. Selain itu, port TCP tidak dirilis segera setelah penutupan koneksi. (Untuk informasi selengkapnya tentang itu, lihat TCP TIME-WAIT
di RFC 9293.) Jika tingkat permintaan tinggi, batas sistem operasi port yang tersedia mungkin habis. Untuk menghindari masalah kelelahan port, sebaiknya gunakan HttpClient kembali instans untuk permintaan HTTP sebanyak mungkin.
Penggunaan yang disarankan
Untuk meringkas penggunaan yang direkomendasikan HttpClient
dalam hal manajemen seumur hidup, Anda harus menggunakan klien berumur panjang dan mengatur PooledConnectionLifetime
(.NET Core dan .NET 5+) atau klien berumur pendek yang dibuat oleh IHttpClientFactory
.
Di .NET Core dan .NET 5+:
static
Gunakan instans singletonHttpClient atau dengan PooledConnectionLifetime diatur ke interval yang diinginkan, seperti 2 menit, tergantung pada perubahan DNS yang diharapkan. Ini memecahkan masalah kelelahan port dan perubahan DNS tanpa menambahkan overhead IHttpClientFactory. Jika Anda harus dapat mengejek handler Anda, Anda dapat mendaftarkannya secara terpisah.
Tip
Jika Anda hanya menggunakan sejumlah HttpClient instans terbatas, itu juga merupakan strategi yang dapat diterima. Yang penting adalah bahwa mereka tidak dibuat dan dibuang dengan setiap permintaan, karena masing-masing berisi kumpulan koneksi. Menggunakan lebih dari satu instans diperlukan untuk skenario dengan beberapa proksi atau untuk memisahkan kontainer cookie tanpa sepenuhnya menonaktifkan penanganan cookie.
Menggunakan IHttpClientFactory, Anda dapat memiliki beberapa klien yang dikonfigurasi secara berbeda untuk kasus penggunaan yang berbeda. Namun, ketahuilah bahwa klien yang dibuat pabrik dimaksudkan untuk berumur pendek, dan setelah klien dibuat, pabrik tidak lagi memiliki kontrol atasnya.
Pabrik mengumpulkan instans HttpMessageHandler , dan, jika masa pakainya belum kedaluwarsa, handler dapat digunakan kembali dari kumpulan saat pabrik membuat instans baru HttpClient . Penggunaan kembali ini menghindari masalah kelelahan soket.
Jika Anda menginginkan konfigurasi yang IHttpClientFactory menyediakan, sebaiknya gunakan pendekatan typed-client.
Di .NET Framework, gunakan IHttpClientFactory untuk mengelola instans Anda
HttpClient
. Jika Anda tidak menggunakan pabrik dan membuat instans klien baru untuk setiap permintaan sendiri, Anda dapat menghabiskan port yang tersedia.Tip
Jika aplikasi Anda memerlukan cookie, pertimbangkan untuk menonaktifkan penanganan cookie otomatis atau menghindari IHttpClientFactory. Mengumpulkan HttpMessageHandler instans menghasilkan berbagi CookieContainer objek. Berbagi objek yang tidak diantipi sering CookieContainer kali menghasilkan kode yang salah.
Untuk informasi selengkapnya tentang mengelola HttpClient
masa pakai dengan IHttpClientFactory
, lihat IHttpClientFactory
panduan.
Ketahanan dengan klien statis
Dimungkinkan untuk mengonfigurasi static
klien atau singleton untuk menggunakan sejumlah alur ketahanan menggunakan pola berikut:
using System;
using System.Net.Http;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Http.Resilience;
using Polly;
var retryPipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddRetry(new HttpRetryStrategyOptions
{
BackoffType = DelayBackoffType.Exponential,
MaxRetryAttempts = 3
})
.Build();
var socketHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(15)
};
var resilienceHandler = new ResilienceHandler(retryPipeline)
{
InnerHandler = socketHandler,
};
var httpClient = new HttpClient(resilienceHandler);
Kode sebelumnya:
- Bergantung pada paket NuGet Microsoft.Extensions.Http.Resilience .
- Menentukan handler kesalahan HTTP sementara, dikonfigurasi dengan alur coba lagi yang dengan setiap upaya akan secara eksponensial melakukan backoff interval penundaan.
- Menentukan masa pakai koneksi terkumpul lima belas menit untuk
socketHandler
. - Meneruskan
socketHandler
keresilienceHandler
dengan logika coba lagi. - Membuat instans yang
HttpClient
diberikanresilienceHandler
.
Penting
Microsoft.Extensions.Http.Resilience
Pustaka saat ini ditandai sebagai eksperimental dan dapat berubah di masa mendatang.
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk