Bagikan melalui


Menggunakan HTTP/3 dengan HttpClient

HTTP/3 adalah versi utama HTTP ketiga dan yang baru-baru ini distandarkan. HTTP/3 menggunakan semantik yang sama dengan HTTP/1.1 dan HTTP/2: metode permintaan, kode status, dan bidang pesan yang sama berlaku untuk semua versi. Perbedaannya ada di transportasi yang mendasar. HTTP/1.1 dan HTTP/2 menggunakan TCP sebagai transportasinya. HTTP/3 menggunakan teknologi transportasi yang dikembangkan bersama HTTP/3 yang disebut QUIC.

HTTP/3 dan QUIC memiliki beberapa manfaat dibandingkan dengan HTTP/1.1 dan HTTP/2:

  • Waktu respons yang lebih cepat untuk permintaan pertama. QUIC dan HTTP/3 menegosiasikan koneksi dalam lebih sedikit perjalanan pulang pergi antara klien dan server. Permintaan pertama mencapai server lebih cepat.
  • Pengalaman yang ditingkatkan ketika ada kehilangan paket koneksi. Multipleks HTTP/2 beberapa permintaan melalui satu koneksi TCP. Kehilangan paket pada koneksi memengaruhi semua permintaan. Masalah ini disebut "pemblokiran head-of-line". Karena QUIC menyediakan multiplexing asli, paket yang hilang hanya memengaruhi permintaan di mana data telah hilang.
  • Mendukung transisi antar jaringan. Fitur ini berguna untuk perangkat seluler di mana umumnya untuk beralih antara WIFI dan jaringan seluler sebagai lokasi perubahan perangkat seluler. Saat ini, koneksi HTTP/1.1 dan HTTP/2 gagal dengan kesalahan saat beralih jaringan. Aplikasi atau browser web harus mencoba kembali permintaan HTTP yang gagal. HTTP/3 memungkinkan aplikasi atau browser web untuk melanjutkan dengan mulus saat jaringan berubah. HttpClient dan Kestrel tidak mendukung transisi jaringan di .NET 7. Ini mungkin tersedia dalam rilis mendatang.

Penting

Aplikasi yang dikonfigurasi untuk memanfaatkan HTTP/3 harus dirancang untuk juga mendukung HTTP/1.1 dan HTTP/2. Jika masalah diidentifikasi dalam HTTP/3, disarankan untuk menonaktifkan HTTP/3 hingga masalah diselesaikan dalam rilis .NET di masa mendatang.

Pengaturan HttpClient

Versi HTTP dapat dikonfigurasi dengan mengatur HttpRequestMessage.Version ke 3.0. Namun, karena tidak semua router, firewall, dan proksi mendukung HTTP/3 dengan benar, disarankan untuk mengonfigurasi HTTP/3 bersama dengan HTTP/1.1 dan HTTP/2. Dalam HttpClient, ini dapat dilakukan dengan menentukan:

Dependensi platform

HTTP/3 menggunakan QUIC sebagai protokol transportasinya. Implementasi .NET HTTP/3 menggunakan MsQuic untuk menyediakan fungsionalitas QUIC. Akibatnya, dukungan .NET HTTP/3 tergantung pada persyaratan platform MsQuic. Untuk informasi selengkapnya tentang cara menginstal MsQuic, lihat dependensi PLATFORM QUIC. Jika platform yang dijalankan HttpClient tidak memiliki semua persyaratan untuk HTTP/3, maka dinonaktifkan.

Menggunakan HttpClient

Contoh kode berikut menggunakan pernyataan tingkat atas dan menunjukkan cara menentukan HTTP3 dalam permintaan:

// See https://aka.ms/new-console-template for more information
using System.Net;

using var client = new HttpClient
{
    DefaultRequestVersion =  HttpVersion.Version30,
    DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact
};

Console.WriteLine("--- localhost:5001 ---");

HttpResponseMessage resp = await client.GetAsync("https://localhost:5001/");
string body = await resp.Content.ReadAsStringAsync();

Console.WriteLine(
    $"status: {resp.StatusCode}, version: {resp.Version}, " +
    $"body: {body.Substring(0, Math.Min(100, body.Length))}");

Dukungan HTTP/3 di .NET 6

Di .NET 6, HTTP/3 tersedia sebagai fitur pratinjau karena spesifikasi HTTP/3 belum diselesaikan. Masalah perilaku atau performa mungkin ada di HTTP/3 dengan .NET 6. Untuk informasi selengkapnya tentang fitur pratinjau, lihat spesifikasi fitur pratinjau.

Untuk mengaktifkan dukungan HTTP/3 di .NET 6, sertakan simpul RuntimeHostConfigurationOption dalam file proyek untuk mengaktifkan HTTP/3 dengan HttpClient:

<ItemGroup>
    <RuntimeHostConfigurationOption Value="true"
        Include="System.Net.SocketsHttpHandler.Http3Support" />
</ItemGroup>

Atau, Anda dapat memanggil System.AppContext.SetSwitch dari kode aplikasi, atau mengatur DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT variabel lingkungan ke true. Untuk informasi selengkapnya, lihat variabel lingkungan .NET: DOTNET_SYSTEM_NET_HTTP_*.

Alasan untuk memerlukan bendera konfigurasi untuk HTTP/3 adalah untuk melindungi aplikasi dari kerusakan di masa mendatang saat menggunakan kebijakan RequestVersionOrHigherversi . Saat memanggil server yang saat ini menggunakan HTTP/1.1 dan HTTP/2, jika server kemudian meningkatkan ke HTTP/3, klien akan mencoba menggunakan HTTP/3 dan berpotensi tidak kompatibel karena standar tidak final dan oleh karena itu dapat berubah setelah .NET 6 dirilis.

.NET 6 hanya kompatibel dengan libmsquic versi 1.9.x. Libmsquic 2.x tidak kompatibel dengan .NET 6 karena perubahan yang merusak di pustaka. Libmsquic menerima pembaruan ke 1.9.x saat diperlukan untuk menggabungkan perbaikan keamanan.

HTTP/3 Server

HTTP/3 didukung oleh ASP.NET dengan server Kestrel di .NET 6 (sebagai pratinjau) dan .NET 7 (didukung sepenuhnya). Untuk informasi selengkapnya, lihat menggunakan HTTP/3 dengan server web ASP.NET Core Kestrel.

Server uji publik

Cloudflare menghosting situs untuk HTTP/3 yang dapat digunakan untuk menguji klien di https://cloudflare-quic.com.

Lihat juga