Aracılığıyla paylaş


HttpClient ile HTTP/3 kullanma

HTTP/3 , HTTP'nin üçüncü ve son standartlaştırılmış 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 taşımadadır. Hem HTTP/1.1 hem de HTTP/2, aktarımları olarak TCP kullanır. HTTP/3, HTTP/3 ile birlikte geliştirilen QUIC adlı bir aktarım teknolojisi kullanır.

HTTP/3 ve QUIC'nin http/1.1 ve HTTP/2 ile karşılaştırıldığında çeşitli avantajları vardır:

  • İlk istek iç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ı anlaşması 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ıdaki paket kaybı tüm istekleri etkiler. Bu soruna "satır başı engelleme" adı verilir. QUIC yerel çoğullama sağladığından, kayıp paketler yalnızca verilerin kaybolduğu istekleri etkiler.
  • Ağlar arasında geçişi destekler. Bu özellik, bir mobil cihaz konum değiştirirken WI-FI ile hücresel ağlar arasında geçiş yapmak yaygın olan 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ş yaparken bir hatayla başarısız olur. Bir uygulama veya web tarayıcısının başarısız http isteklerini yeniden denemesi gerekir. HTTP/3, bir ağ değiştiğinde uygulamanın veya web tarayıcısının sorunsuz bir şekilde devam etmesini sağlar. HttpClient ve Kestrel, .NET 7'de ağ geçişlerini desteklemez. Gelecek bir sürümde kullanılabilir.

Önemli

HTTP/3'ün avantajlarından yararlanmak için yapılandırılan uygulamalar, HTTP/1.1 ve HTTP/2'yi de destekleyecek şekilde tasarlanmalıdır. HTTP/3'te sorunlar belirlenirse, sorunlar .NET'in gelecek bir sürümünde çözülene kadar HTTP/3'ün devre dışı bırakılması önerilir.

HttpClient ayarları

HTTP sürümü 3.0 olarak ayarlanarak HttpRequestMessage.Version yapılandırılabilir. Ancak tüm yönlendiriciler, güvenlik duvarları ve proxy'ler HTTP/3'ün doğru şekilde desteklenmediğinden HTTP/3'ün HTTP/1.1 ve HTTP/2 ile birlikte yapılandırılması önerilir. içinde HttpClient, bu şu şekilde belirtilerek yapılabilir:

Platform bağımlılıkları

HTTP/3, aktarım protokolü olarak QUIC kullanır. HTTP/3'ün .NET uygulaması, QUIC işlevselliği sağlamak için MsQuic kullanır. Sonuç olarak, HTTP/3'ün .NET desteği MsQuic platform gereksinimlerine bağlıdır. MsQuic'i yükleme hakkında daha fazla bilgi için bkz. QUIC Platformu bağımlılıkları. HttpClient'ın üzerinde çalıştığı platform http/3 için tüm gereksinimlere sahip değilse devre dışı bırakılır.

HttpClient kullanma

Aşağıdaki kod örneği üst düzey deyimleri kullanır ve istekte HTTP3'in nasıl belirtileceğini gösterir:

// 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))}");

.NET 6'da HTTP/3 Desteği

.NET 6'da HTTP/3 belirtimi henüz sonlandırılmadığından, HTTP/3 önizleme özelliği olarak kullanılabilir. .NET 6 ile HTTP/3'te davranış veya performans sorunları olabilir. Önizleme özellikleri hakkında daha fazla bilgi için bkz . önizleme özellikleri belirtimi.

.NET 6'da HTTP/3 desteğini etkinleştirmek için, ile HTTP/3'i HttpClientetkinleştirmek için düğümü proje dosyasına ekleyinRuntimeHostConfigurationOption:

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

Alternatif olarak, uygulama kodunuzdan çağrısı System.AppContext.SetSwitch yapabilir veya ortam değişkenini DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP3SUPPORT olarak trueayarlayabilirsiniz. Daha fazla bilgi için bkz . .NET ortam değişkenleri: DOTNET_SYSTEM_NET_HTTP_*.

HTTP/3 için yapılandırma bayrağı gerektirmenin nedeni, sürüm ilkesi RequestVersionOrHigherkullanılırken uygulamaları gelecekteki kesintilere karşı korumaktır. Şu anda HTTP/1.1 ve HTTP/2 kullanan bir sunucuyu çağırırken, sunucu daha sonra HTTP/3'e yükseltilirse, istemci HTTP/3 kullanmayı dener ve standart nihai olmadığından uyumsuz olabilir ve bu nedenle .NET 6 yayımlandıktan sonra değişebilir.

.NET 6 yalnızca libmsquic'in 1.9.x sürümleriyle uyumludur. Kitaplıktaki hataya neden olan değişiklikler nedeniyle Libmsquic 2.x .NET 6 ile uyumlu değildir. Libmsquic, güvenlik düzeltmelerini eklemek için gerektiğinde 1.9.x güncelleştirmelerini alır.

HTTP/3 Sunucusu

HTTP/3, .NET 6 (önizleme olarak) ve .NET 7'de Kestrel sunucusuyla (tam olarak desteklenir) ASP.NET tarafından desteklenir. Daha fazla bilgi için bkz . ASP.NET Core Kestrel web sunucusuyla HTTP/3 kullanma.

Genel test sunucuları

Cloudflare, http/3 için istemciyi adresinde https://cloudflare-quic.comtest etmek için kullanılabilecek bir site barındırıyor.

Ayrıca bkz.