Kelas System.Net.Http.HttpClient
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Instans HttpClient kelas bertindak sebagai sesi untuk mengirim permintaan HTTP. Instans HttpClient adalah kumpulan pengaturan yang diterapkan ke semua permintaan yang dijalankan oleh instans tersebut. Selain itu, setiap HttpClient instans menggunakan kumpulan koneksinya sendiri, mengisolasi permintaannya dari permintaan yang dijalankan oleh instans lain HttpClient .
Instancing
HttpClient dimaksudkan untuk diinstansiasi sekali dan digunakan kembali selama masa pakai aplikasi. Di .NET Core dan .NET 5+, HttpClient mengumpulkan koneksi di dalam instans handler dan menggunakan kembali koneksi di beberapa permintaan. Jika Anda membuat instans kelas HttpClient untuk setiap permintaan, jumlah soket yang tersedia di bawah beban berat akan habis. Kelelahan ini akan mengakibatkan SocketException kesalahan.
Anda dapat mengonfigurasi opsi tambahan dengan meneruskan "handler", seperti HttpClientHandler (atau SocketsHttpHandler di .NET Core 2.1 atau yang lebih baru), sebagai bagian dari konstruktor. Properti koneksi pada handler tidak dapat diubah setelah permintaan dikirimkan, jadi salah satu alasan untuk membuat instans HttpClient baru adalah jika Anda perlu mengubah properti koneksi. Jika permintaan yang berbeda memerlukan pengaturan yang berbeda, ini juga dapat menyebabkan aplikasi memiliki beberapa HttpClient instans, di mana setiap instans dikonfigurasi dengan tepat, lalu permintaan dikeluarkan pada klien yang relevan.
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 kontainer, klien tidak akan menghormati pembaruan tersebut. Untuk mengatasi masalah ini, Anda dapat membatasi masa pakai koneksi dengan mengatur SocketsHttpHandler.PooledConnectionLifetime properti , sehingga pencarian DNS diperlukan saat koneksi diganti.
public class GoodController : ApiController
{
private static readonly HttpClient httpClient;
static GoodController()
{
var socketsHandler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(2)
};
httpClient = new HttpClient(socketsHandler);
}
}
Sebagai alternatif untuk membuat hanya satu instans HttpClient, Anda juga dapat menggunakan IHttpClientFactory untuk mengelola instans HttpClient untuk Anda. Untuk informasi selengkapnya, lihat Panduan untuk menggunakan HttpClient.
Derivasi
juga HttpClient bertindak sebagai kelas dasar untuk klien HTTP yang lebih spesifik. Contohnya adalah FacebookHttpClient yang menyediakan metode tambahan khusus untuk layanan web Facebook (misalnya, GetFriends
metode). Kelas turunan tidak boleh mengambil alih metode virtual pada kelas . Sebagai gantinya, gunakan kelebihan beban konstruktor yang menerima untuk mengonfigurasi pemrosesan pra-permintaan atau pasca-permintaan HttpMessageHandler .
Transportasi
HttpClient adalah API tingkat tinggi yang membungkus fungsionalitas tingkat bawah yang tersedia di setiap platform tempatnya berjalan.
Pada setiap platform, HttpClient mencoba menggunakan transportasi terbaik yang tersedia:
Host/Runtime | Backend |
---|---|
Windows/.NET Framework | HttpWebRequest |
Windows/Mono | HttpWebRequest |
Windows/UWP | Windows native WinHttpHandler (berkemampu HTTP 2.0) |
Windows/.NET Core 1.0-2.0 | Windows native WinHttpHandler (berkemampu HTTP 2.0) |
Android/Xamarin | Dipilih pada build-time. Dapat menggunakan HttpWebRequest atau dikonfigurasi untuk menggunakan asli Android HttpURLConnection |
iOS, tvOS, watchOS/Xamarin | Dipilih pada build-time. Dapat menggunakan HttpWebRequest atau dikonfigurasi untuk menggunakan Apple NSUrlSession (berkemampukan HTTP 2.0) |
macOS/Xamarin | Dipilih pada build-time. Dapat menggunakan HttpWebRequest atau dikonfigurasi untuk menggunakan Apple NSUrlSession (berkemampukan HTTP 2.0) |
macOS/Mono | HttpWebRequest |
macOS/.NET Core 1.0-2.0 | libcurl Transportasi HTTP berbasis -(berkemampuan HTTP 2.0) |
Linux/Mono | HttpWebRequest |
Linux/.NET Core 1.0-2.0 | libcurl Transportasi HTTP berbasis -(berkemampuan HTTP 2.0) |
Versi .NET Core 2.1 dan yang lebih baru. | System.Net.Http.SocketsHttpHandler |
Pengguna juga dapat mengonfigurasi transportasi tertentu dengan HttpClient memanggil HttpClient konstruktor yang mengambil HttpMessageHandler.
.NET Framework & Mono
Secara default pada .NET Framework dan Mono, HttpWebRequest digunakan untuk mengirim permintaan ke server. Perilaku ini dapat dimodifikasi dengan menentukan handler yang berbeda di salah satu overload konstruktor dengan HttpMessageHandler parameter . Jika Anda memerlukan fitur seperti autentikasi atau penembolokan, Anda dapat menggunakan WebRequestHandler untuk mengonfigurasi pengaturan dan instans dapat diteruskan ke konstruktor. Handler yang dikembalikan dapat diteruskan ke kelebihan beban konstruktor yang memiliki HttpMessageHandler parameter .
.NET Core
Dimulai dengan .NET Core 2.1, System.Net.Http.SocketsHttpHandler kelas alih-alih HttpClientHandler menyediakan implementasi yang digunakan oleh kelas jaringan HTTP tingkat lebih tinggi seperti HttpClient. Penggunaan SocketsHttpHandler menawarkan sejumlah keuntungan:
- Peningkatan performa yang signifikan jika dibandingkan dengan implementasi sebelumnya.
- Penghapusan dependensi platform, yang menyederhanakan penyebaran dan layanan. Misalnya,
libcurl
tidak lagi menjadi dependensi pada .NET Core untuk macOS dan .NET Core untuk Linux. - Perilaku konsisten di semua platform .NET.
Jika perubahan ini tidak diinginkan, pada Windows Anda dapat terus menggunakan WinHttpHandler dengan merujuk paket NuGet-nya dan meneruskannya ke konstruktor HttpClient secara manual.
Mengonfigurasi perilaku menggunakan opsi konfigurasi runtime
Aspek tertentu dari HttpClientperilaku dapat disesuaikan melalui opsi konfigurasi Runtime. Namun, perilaku sakelar ini berbeda melalui versi .NET. Misalnya, di .NET Core 2.1 - 3.1, Anda dapat mengonfigurasi apakah SocketsHttpHandler digunakan secara default, tetapi opsi tersebut tidak lagi tersedia mulai dari .NET 5.
Pengumpulan koneksi
HttpClient mengumpulkan koneksi HTTP jika memungkinkan dan menggunakannya untuk lebih dari satu permintaan. Ini dapat memiliki manfaat performa yang signifikan, terutama untuk permintaan HTTPS, karena jabat tangan koneksi hanya dilakukan sekali.
properti kumpulan Koneksi ion dapat dikonfigurasi pada HttpClientHandler atau SocketsHttpHandler diteruskan selama konstruksi, termasuk MaxConnectionsPerServer, PooledConnectionIdleTimeout, dan PooledConnectionLifetime.
Membuang instans HttpClient menutup koneksi terbuka dan membatalkan permintaan yang tertunda.
Catatan
Jika Anda secara bersamaan mengirim permintaan HTTP/1.1 ke server yang sama, koneksi baru dapat dibuat. Bahkan jika Anda menggunakan HttpClient
kembali instans, jika tingkat permintaan tinggi, atau jika ada batasan firewall, yang dapat menghabiskan soket yang tersedia karena timer pembersihan TCP default. Untuk membatasi jumlah koneksi bersamaan, Anda dapat mengatur MaxConnectionsPerServer
properti . Secara default, jumlah koneksi HTTP/1.1 bersamaan tidak terbatas.
Buffering dan masa pakai permintaan
Secara default, metode HttpClient (kecuali GetStreamAsync) buffer respons dari server, membaca semua isi respons ke dalam memori sebelum mengembalikan hasil asinkron. Permintaan tersebut akan berlanjut sampai salah satu hal berikut terjadi:
- Berhasil Task<TResult> dan mengembalikan hasil.
- Timeout tercapai, dalam hal ini Task<TResult> akan dibatalkan.
- Yang CancellationToken dapat diteruskan ke beberapa metode kelebihan beban diaktifkan.
- CancelPendingRequests() dipanggil.
- HttpClient dibuang.
Anda dapat mengubah perilaku buffering berdasarkan per permintaan menggunakan parameter yang HttpCompletionOption tersedia pada beberapa metode kelebihan beban. Argumen ini dapat digunakan untuk menentukan apakah Task<TResult> harus dianggap selesai setelah hanya membaca header respons, atau setelah membaca dan buffer konten respons.
Jika aplikasi Anda yang menggunakan HttpClient dan kelas terkait di System.Net.Http namespace ingin mengunduh data dalam jumlah besar (50 megabyte atau lebih), aplikasi harus melakukan streaming unduhan tersebut dan tidak menggunakan buffering default. Jika Anda menggunakan buffering default, penggunaan memori klien akan menjadi sangat besar, berpotensi mengakibatkan performa yang berkurang secara substansial.
Keamanan utas
Metode berikut aman untuk utas:
- CancelPendingRequests
- DeleteAsync
- GetAsync
- GetByteArrayAsync
- GetStreamAsync
- GetStringAsync
- PostAsync
- PutAsync
- SendAsync
Proksi
Secara default, HttpClient membaca konfigurasi proksi dari variabel lingkungan atau pengaturan pengguna/sistem, tergantung pada platform. Anda dapat mengubah perilaku ini dengan meneruskan WebProxy atau IWebProxy ke, dalam urutan prioritas:
- Proxy Properti pada HttpClientHandler diteruskan selama konstruksi HttpClient
- Properti DefaultProxy statis (memengaruhi semua instans)
Anda dapat menonaktifkan proksi menggunakan UseProxy. Konfigurasi default untuk pengguna Windows adalah mencoba dan mendeteksi proksi menggunakan penemuan jaringan, yang bisa lambat. Untuk aplikasi throughput tinggi di mana diketahui bahwa proksi tidak diperlukan, Anda harus menonaktifkan proksi.
Pengaturan proksi (seperti Credentials) harus diubah hanya sebelum permintaan pertama dibuat menggunakan HttpClient. Perubahan yang dilakukan setelah menggunakan HttpClient untuk pertama kalinya mungkin tidak tercermin dalam permintaan berikutnya.
Waktu habis
Anda dapat menggunakan Timeout untuk mengatur batas waktu default untuk semua permintaan HTTP dari instans HttpClient. Batas waktu hanya berlaku untuk metode xxxAsync yang menyebabkan permintaan/respons dimulai. Jika batas waktu tercapai, untuk permintaan tersebut Task<TResult> dibatalkan.
Anda dapat mengatur beberapa batas waktu tambahan jika Anda meneruskan SocketsHttpHandler instans saat membuat objek HttpClient:
Properti | Deskripsi |
---|---|
ConnectTimeout | Menentukan batas waktu yang digunakan saat permintaan memerlukan koneksi TCP baru untuk dibuat. Jika waktu habis terjadi, permintaan Task<TResult> dibatalkan. |
PooledConnectionLifetime | Menentukan batas waktu yang akan digunakan untuk setiap koneksi di kumpulan koneksi. Jika koneksi diam, koneksi segera ditutup; jika tidak, koneksi ditutup di akhir permintaan saat ini. |
PooledConnectionIdleTimeout | Jika koneksi di kumpulan koneksi diam selama ini, koneksi ditutup. |
Expect100ContinueTimeout | Jika permintaan memiliki header "Expect: 100-continue", permintaan akan menunda pengiriman konten hingga batas waktu atau hingga respons "100 lanjutkan" diterima. |
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 kontainer, Anda dapat menggunakan PooledConnectionLifetime untuk membatasi masa pakai koneksi sehingga pencarian DNS diperlukan saat mengganti koneksi.