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.

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 ke resilienceHandler dengan logika coba lagi.
  • Membuat instans yang HttpClient diberikan resilienceHandler.

Penting

Microsoft.Extensions.Http.Resilience Pustaka saat ini ditandai sebagai eksperimental dan dapat berubah di masa mendatang.

Lihat juga