HttpClient ile HTTP/3 kullanma
HTTP/3, HTTP'nin üçüncü ve yaklaşan ana sürümüdür. HTTP/3, HTTP/1.1 ve HTTP/2 ile aynı semantiği kullanır: Tüm sürümler için aynı istek yöntemleri, durum kodları ve ileti alanları geçerlidir. Farklılıklar, temel alınan aktarımdadır. Hem HTTP/1.1 hem de HTTP/2 aktarımları olarak TCP kullanır. HTTP/3, HTTP/3 ile birlikte geliştirilen ve QUICadlı yeni bir aktarım teknolojisi kullanır.
HTTP/3 ve QUIC' nin HTTP/1.1 ve HTTP/2'ye kıyasla bir dizi avantajları vardır:
- İlk isteğin daha hızlı yanıt süresi. QUIC ve HTTP/3, istemci ile sunucu arasında daha az gidiş dönüşte bağlantı üzerinde anlaşma sağlar. İlk istek sunucuya daha hızlı ulaşır.
- Bağlantı paketi kaybı olduğunda geliştirilmiş deneyim. HTTP/2, bir TCP bağlantısı aracılığıyla birden çok isteği birden çok kez katlar. Bağlantıda paket kaybı tüm istekleri etkiler. Bu soruna "satır başı engelleme" denir. QUIC yerel çoklama sağladığından, kayıp paketler yalnızca verilerin kayıp olduğu istekleri etkiler.
- Ağlar arasında geçişi destekler. Bu özellik, mobil cihazın konumu değiştikleri için WIFI ve hücresel ağlar arasında geçişin yaygın olduğu mobil cihazlar için kullanışlıdır. Şu anda HTTP/1.1 ve HTTP/2 bağlantıları ağlar arasında geçiş sırasında hatayla başarısız oluyor. Bir uygulamanın veya web tarayıcısının başarısız http isteklerini yeniden denemesi gerekir. HTTP/3, ağ değiştinde uygulamanın veya web tarayıcısının sorunsuz bir şekilde devam gerçekleştirilir. HttpClient ve Kestrel, .NET 6'da ağ geçişlerini desteklemez. Gelecek bir sürümde kullanılabilir olabilir.
Önemli
HTTP/3 belirtimi kesinleştirilmiş değildir ve davranış veya performans sorunları .NET 6 ile HTTP/3'te mevcut olduğundan, .NET 6'da önizleme özelliği olarak HTTP/3 kullanılabilir.
Önizleme özellikleri hakkında daha fazla bilgi için bkz. önizleme özellikleri belirtimi.
HTTP/3'den yararlanan uygulamalar HTTP/1.1 ve HTTP/2'yi destekleyecek şekilde tasarlanmalı. SORUNLAR HTTP/3'te tanımlanırsa, sorunlar .NET'in gelecek bir sürümüne çözümlenene kadar HTTP/3'ü devre dışı bırakmayı öneririz.
HttpClient Ayarlar
HTTP/3 desteği önizlemededir ve aşağıdakilerle projede ayarlan bir yapılandırma bayrağı aracılığıyla etkinleştirilmesi gerekir:
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
</ItemGroup>
Veya AppContext.SetSwitch kullanarak.
HTTP sürümü HttpRequestMessage.Version 3.0 olarak ayararak yalıtabilirsiniz. Ancak, tüm yönlendiriciler, güvenlik duvarları ve yan sunucular HTTP/3'ü düzgün desteklemez, HTTP/1.1 ve HTTP/2 ile birlikte HTTP/3'ü yapılandırmanız önerilir. HttpClient'da bu, şunları belirterek yapılabilir:
HttpRequestMessage.Version1.1'e kadar.HttpRequestMessage.VersionPolicyiçinHttpVersionPolicy.RequestVersionOrHigher.
HTTP/3 için yapılandırma bayrağı gerektirmenin nedeni, uygulamaları sürüm ilkesi kullanırken gelecekte kesintiye karşı RequestVersionOrHigher korumaktır. Şu anda HTTP/1.1 ve HTTP/2 kullanan bir sunucuyu çağırıyorsanız, sunucu daha sonra HTTP/3'e yükseltilen bir sunucuyu çağırarak HTTP/3 kullanmayı dener ve standart son değildir ve bu nedenle .NET 6 yayından sonra değişebilir.
Platform Bağımlılıkları
HTTP/3, aktarım protokolü olarak QUIC kullanır. HTTP/3'in .NET uygulaması, QUIC işlevselliği sağlamak için MsQuic kullanır. MsQuic, windows'un belirli derlemelerine ve Linux için bir kitaplık olarak dahil edilir. HttpClient'ın üzerinde çalıştır olduğu platform HTTP/3 için tüm gereksinimlere sahip değilse devre dışı bırakılır.
Windows
- Windows 11 Derleme 22000 (sürüm 21H2) veya sonrası.
- TLS 1.3 veya sonraki bir bağlantı.
Linux
Linux'ta libmsquic, Microsoft'un resmi Linux paket deposu packages.microsoft.com. Bunu tüketmek için el ile ekleniyor olması gerekir. Bkz. Microsoft Ürünleri için Linux Yazılım Deposu. Paket akışı yapılandırıldıktan sonra, dağıtım paketinizin paket yöneticisi aracılığıyla (örneğin, Ubuntu için) yükleyebilirsiniz:
sudo apt install libmsquic
Mac OS
HTTP/3 şu anda macOS'ta desteklenmiyor, ancak gelecek bir sürümde kullanılabilir.
HttpClient kullanma
HttpClient ile HTTP/3'ü etkinleştirmek için proje dosyasına aşağıdakileri dahil edin:
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
</ItemGroup>
Aşağıdaki kod örneği üst düzey deyimleri kullanır ve istekte HTTP3 belirtmeyi gösteriyor:
// See https://aka.ms/new-console-template for more information
using System.Net;
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))}");
HTTP/3 Sunucusu
HTTP/3, .NET 6'ASP.NET Kestrel sunucusuyla birlikte desteklenen bir hizmettir. Daha fazla bilgi için bkz. Kestrel web sunucusu ASP.NET Core HTTP/3 kullanma.
Genel test sunucuları
Cloudflare, http/3 için istemciyi şu adreste test etmek için kullanılmaktadır: https://cloudflare-quic.com/