Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
HttpClientFactory memungkinkan Anda mengonfigurasi HttpMessageHandler alur untuk objek bernama dan yang ditik HttpClient . Handler paling dalam, atau yang benar-benar mengirim permintaan pada kawat, disebut handler utama. Jika tidak dikonfigurasi, handler ini sebelumnya selalu menjadi HttpClientHandler. Meskipun handler utama default adalah detail implementasi, ada pengguna yang bergantung padanya. Misalnya, beberapa pengguna melemparkan handler utama ke HttpClientHandler untuk mengatur properti seperti ClientCertificates, UseCookies, dan UseProxy.
Dengan perubahan ini, handler utama default adalah SocketsHttpHandler platform yang mendukungnya. Pada platform lain, misalnya, .NET Framework, HttpClientHandler terus digunakan.
SocketsHttpHandler sekarang juga memiliki PooledConnectionLifetime preset properti untuk mencocokkan HandlerLifetime nilai. (Ini mencerminkan nilai terbaru, jika HandlerLifetime dikonfigurasi oleh pengguna).
Versi yang diperkenalkan
Pratinjau .NET 9 6
Perilaku sebelumnya
Handler utama default adalah HttpClientHandler. Transmisikan ke HttpClientHandler untuk memperbarui properti yang kebetulan berfungsi.
services.AddHttpClient("test")
.ConfigurePrimaryHttpMessageHandler((h, _) =>
{
((HttpClientHandler)h).UseCookies = false;
});
// This worked.
var client = httpClientFactory.CreateClient("test");
Perilaku yang baru
Pada platform di mana SocketsHttpHandler didukung, handler utama default sekarang SocketsHttpHandler dengan PooledConnectionLifetime diatur ke HandlerLifetime nilai . Transmisikan ke HttpClientHandler untuk memperbarui properti melemparkan InvalidCastException.
Misalnya, kode yang sama dari bagian Perilaku sebelumnya sekarang melempar :InvalidCastException
System.InvalidCastException: Tidak dapat mentransmisikan objek tipe 'System.Net.Http.SocketsHttpHandler' untuk mengetik 'System.Net.Http.HttpClientHandler'.
Jenis perubahan yang melanggar
Perubahan ini adalah perubahan perilaku.
Alasan untuk berubah
Salah satu masalah HttpClientFactory paling umum yang dialami pengguna adalah ketika klien Named atau Typed secara keliru ditangkap dalam layanan singleton, atau, secara umum, disimpan di suatu tempat untuk jangka waktu yang lebih lama dari yang ditentukan HandlerLifetime. Karena HttpClientFactory tidak dapat memutar handler tersebut, mereka mungkin akhirnya tidak menghormati perubahan DNS.
Masalah ini dapat dimitigasi dengan menggunakan SocketsHttpHandler, yang memiliki opsi untuk mengontrol PooledConnectionLifetime. Demikian HandlerLifetimepula dengan , masa pakai koneksi yang dikumpulkan memungkinkan membuat ulang koneksi secara teratur untuk mengambil perubahan DNS, tetapi pada tingkat yang lebih rendah. Klien dengan PooledConnectionLifetime pengaturan dapat digunakan dengan aman sebagai singleton.
Sayangnya, mudah dan tampaknya "intuitif" untuk menyuntikkan Typed klien ke dalam satuton. Tetapi sulit untuk memiliki jenis pemeriksaan atau penganalisis untuk memastikan HttpClient tidak ditangkap ketika seharusnya tidak ditangkap. Juga sulit untuk memecahkan masalah yang dihasilkan. Jadi sebagai tindakan pencegahan—untuk meminimalkan dampak potensial dari pola penggunaan yang salah— SocketsHttpHandler mitigasi sekarang diterapkan secara default.
Perubahan ini hanya memengaruhi kasus ketika klien tidak dikonfigurasi oleh pengguna akhir untuk menggunakan kustom PrimaryHandler (misalnya, melalui ConfigurePrimaryHttpMessageHandler<THandler>(IHttpClientBuilder)).
Tindakan yang direkomendasikan
Ada tiga opsi untuk mengatasi perubahan yang melanggar:
Tentukan dan konfigurasikan handler utama secara eksplisit untuk setiap klien Anda:
services.AddHttpClient("test") .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false });Timpa handler utama default untuk semua klien menggunakan ConfigureHttpClientDefaults(IServiceCollection, Action<IHttpClientBuilder>):
services.ConfigureHttpClientDefaults(b => b.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { UseCookies = false }));Dalam tindakan konfigurasi, periksa dan
HttpClientHandlerSocketsHttpHandler:services.AddHttpClient("test") .ConfigurePrimaryHttpMessageHandler((h, _) => { if (h is HttpClientHandler hch) { hch.UseCookies = false; } if (h is SocketsHttpHandler shh) { shh.UseCookies = false; } });