Gereksinimler: Çoğu web sitesi artık esas olarak Http/1.1 ve Http/2.0 sürüm protokollerini kullanır; yalnızca HTTP/2 protokol sürümünü destekleyen siteler için varsayılan olarak HttpClient kullanarak istek gönderirken, System.Net.Http.Http.Http.RequestException gönderilirken bir hata ortaya çıkar. ---> System.IO.IOException: Taşıma bağlantısından veri okunamıyor: Ana bilgisayarınızdaki yazılım kurulmuş bir bağlantıyı iptal etti. ---> System.Net.Sockets.SocketException (10053): Ana bilgisayarınızdaki yazılım, kurulmuş bir bağlantıyı iptal eder. at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, Boolean forAsyncThrow).
HTTP protokolünün tarihi
Zaman çizelgesi
HTTP/0.9
Modası geçmiş HTTP/0.9, 1989'da doğan HTTP protokolünün ilk sürümüydü. Son derece basittir, istemcinin GET talebi göndermesine izin verir ve istek başlığını desteklemez. Protokol başlığı olmadığı için, HTTP/0.9 yalnızca bir tür içerik - düz metin - destekleyebilir. Sunucu yalnızca HTML formatındaki dizelere yanıt verebilir, diğer formatlara değil. Sunucu göndermeyi bitirdiğinde, TCP bağlantısı kapanır. HTTP/0.9 tipik bir durumsuzluğa sahiptir; her ziyaret bağımsız olarak işlenir ve işlem tamamlandığında bağlantısı kesilir. İstenen sayfa mevcut değilse, hata kodu döner.
HTTP/1
HTTP/1, HTTP 1.0 ve HTTP 1.1 için toplu bir terimdir ve sırasıyla 1.0 ve 1.1 olan HTTP protokolü sürümlerini ifade eder. HTTP 1.0, HTTP protokolünün ikinci sürümüydü ve bugün hâlâ yaygın olarak kullanılmaktadır. HTTP/0.9 temelli bir dizi geliştirme ve iyileştirme yapmıştır, bunlar arasında:
Sadece metnin ötesine kadar görseller, videolar, ikili dosyalar gibi daha fazla format gönderilebilir Üstüne ve POST isteği yöntemleri eklendi HTTP isteği ve yanıtlarının formatı değiştirildi. Veri kısmına ek olarak, her iletişimde bazı metaveriyi tanımlayan bir HTTP başlığı içermelidir; yani istek başlığı bilgisi eklenir Yanıt durum kodu, çoklu karakter desteği, yetkilendirme, önbellek ve içerik kodlaması gibi eklenen fonksiyonlar Hâlâ durumsuz bir protokol olmasına rağmen, uzun bağlantılar isteğe "Connection: keep-alive" başlığı eklenerek desteklenebilir
HTTP 1.1
HTTP 1.1 standartlaştırılmış bir protokoldür ve HTTP 1.1 birçok belirsizliği ortadan kaldırır ve birçok iyileştirme getirir.
özellik
Önbellek işleme ile birlikte, HTTP 1.1, önbellek etiketi, If-Unmodified-Since, If-Match, If-None-Match gibi daha fazla önbellek kontrol politikası ve önbellek politikasını kontrol etmek için daha fazla isteğe bağlı önbellek başlığı getirir. Bant genişliği optimizasyonu ve ağ bağlantılarının kullanımı, talep başlığında bir aralık oluşturur; bu da yalnızca bir kaynağın bir kısmının istenmesine izin verir; yani 206 durum kodunu geri döndürür; bu da geliştiricilerin bant ve bağlantıları özgürce kullanmasını kolaylaştırır ve Aralık ile İçerik-Aralığı kullanarak bir breakpoint yeniden devam fonksiyonu oluşturabilir. Hata bildirimi yönetimi, HTTP 1.1'de 24 yeni hata durumu kodu eklendi. Host başlığı eklendiğinde, aynı IP adresine sahip sunucularda farklı alan adlarının yapılandırılmasına olanak tanır. Uzun bağlantıları destekler, HTTP 1.1 uzun bağlantıları destekler, bir TCP bağlantısı üzerinde birden fazla HTTP isteği ve yanıtı iletilebilir, böylece bağlantı kurma ve kapatma tüketimi ve gecikme azalır; HTTP 1.1'de Connection:keep-alive varsayılan olarak etkinleştirilmiştir ve genel tarayıcılar aynı alan adı için aynı anda 6 uzun bağlantının kurulmasına izin verir. Kuyruk engellemesini iyileştirmek için ilk yanıt tam olarak gönderilmeden önce ikinci bir istek gönderilmesini sağlayan pipeline teknolojisi eklendi, ancak yanıtların sırası yine de taleplerin sırasına göre geri dönecek. Yanıt parçalamasını desteklemek, Transfer-Encoding: chunked for chunked response (chunked response) ayarları ile yanıt verisinin birden fazla parçaya bölünmesine izin verir ve sunucu, daha hızlı yanıt hızı elde etmek için tamponu mümkün olan en kısa sürede serbest bırakabilir.
HTTP 2.0
HTTP 2.0 daha iyi performansa sahip ve artık web sayfaları giderek daha karmaşık hale geliyor, hatta benzersiz uygulamalara dönüşüyor, medya oynatma miktarı, etkileşimi artırmak için betik boyutları da çok arttı ve HTTP istekleri aracılığıyla daha fazla veri iletiliyor, bu yüzden HTTP 2.0 ağ verimliliği için birçok optimizasyon yaptı.
özellik
İkili Çerçeve Bölme, HTTP 2.0, iletilen tüm bilgileri daha küçük mesajlara ve çerçevelere ayıran ve bunları ikili formatta kodlayan bir metin protokolü yerine ikili bir protokoldür. Çoklu çaplı paralel istekler aynı bağlantıda işlenebilir, aynı alan adı altında tüm erişimler aynı TCP bağlantısından gelir, HTTP mesajları bağımsız çerçevelere ayrılır ve sunucu, mesajları tanımlayıcılar ve başlıklara göre yeniden birleştirerek HTTP 1.1'deki sıralamayı kaldırır ve engelleme kısıtlamalarını engeller. Başlıkların sıkıştırılması, genellikle bir dizi istek içinde benzer olan ve çoğaltılmış verilerin çoğaltılması ve iletimine maliyeti ortadan kaldırır. Sunucu tarafı push'ta, sunucu istemciden açıkça talep almadan kaynakları proaktif olarak istemciye itebilir.
HTTP 3.0
HTTP 3.0 şu anda formülasyon ve test aşamasında, gelecekte yeni bir HTTP protokolü olarak geliştiriliyor, HTTP 3.0 protokolü QUIC protokolünün üzerinde çalışıyor, güvenilir iletim ve iletim güvenilirliği sağlamak için UDP tabanlı bir yapıya sahip, iletim hızını takas etmek ve optimizasyon sağlamak için UDP kullanmak TCP kuyruk engelleme sorununu önleyecek ve ağ iletim hızını hızlandıracak, ancak aynı zamanda güvenilir bir iletim mekanizması da sağlanması gerekiyor; HTTP 3.0, HTTP 2.0'ın bir uzantısı değildir, HTTP 3.0 tamamen yeni bir protokol olacak.
HttpClientHandler VS SocketsHttpHandler
.NET Framework ve .NET Core 2.0 ve daha önceki sürümlerde HttpClient tarafından kullanılan varsayılan mesaj işleyicisi HttpClientHandler'dır.
.NET Core 2.1 ile başlayan sınıflarSocketsHttpHandler, daha yüksek seviyeli bir HTTP ağ sınıfı sağlar(örneğin HttpClient). Sockets kullanmakHttpHandler birçok avantaj sunar:
Performans, önceki uygulamalara kıyasla önemli ölçüde gelişmiştir. Platform bağımlılıklarını ortadan kaldırarak dağıtımı ve hizmeti basitleştirin. Örneğin, libcurl artık macOS için .NET Core ve Linux için .NET Core'a bağımlı değil. Tüm .NET platformlarında tutarlı davranış.
.NET 9'da, HttpClientFactory ana handler olarak SocketsHttpHandler'ı kullanır
HttpClientFactory, adlandırılmış ve tiplenen HttpMessageHandler nesneleri için HttpClient boru hatlarının yapılandırılmasına olanak tanır. Ağ üzerinden gerçekten istek gönderen içteki yönetici ana yönetici olarak adlandırılır. Eğer yapılandırılmadıysa, bu handler önceden her zaman bir HttpClientHandler olmuştur. Varsayılan ana handler uygulama detayları olsa da, buna güvenen kullanıcılar da var. Örneğin, bazı kullanıcılar ana handler'ı ClientCertificates, UseCookies ve UseProxy gibi HttpClientHandler ayar özelliklerine gönderir.
Bağlantı:Bağlantı girişi görünür.
Küresel yapılandırma HTTP protokol sürümünü talep eder
Kod şöyledir:
DefaultRequestVersionVarsayılan ayar HttpVersion.Version11'dir。
DefaultRequestVersion özelliği, bu HttpClient örneği kullanılarak gönderilen istekler için kullanılacak varsayılan HTTP sürümünü belirler; Göndermek üzere HttpRequestMessage oluşturulduğunda, özellikle 、、、GetStreamAsyncGetAsyncGetAsyncGetByteArrayAsync, PatchAsyncGetStringAsync, PostAsync ve PutAsync.
DefaultRequestVersion özelliğiSendAsync yöntemi için geçerli değildir。 SendAsync yöntemine parametre olarak iletilen HttpRequestMessage parametresi, istek için kullanılan HTTP sürümünü kontrol eden kendi Sürüm özelliğine sahiptir.
Bağlantı:Bağlantı girişi görünür.
HttpVersionPolicy müzakere politikası
RequestVersionOrLower: İstenen sürümü kullanın veya daha düşük bir sürüme (ancak istenen sürümden daha yüksek olmayan) düşürün. Bu varsayılan davranıştır. Basitçe söylemek gerekirse, en çok kullanılan protokol versiyonu mevcut sürümdür ve mevcut protokol sürümü desteklenmezse düşürülür.
RequestVersionOrHigher: Sunucu tarafından desteklenen en yüksek sürümü kullanın, ancak istenen sürümden daha düşük olmamalıdır. Yani, yükseltmelere izin verilir ve istenen sürümün altına düşürülmelere izin verilmez. Basitçe söylemek gerekirse, iletişim için mümkün olduğunca daha yüksek sürümlü protokoller kullanın.
RequestVersionExact: Sadece istenen sürümü kullanın, yükseltme veya düşüş yapılmaz.
HttpClient Http/2.0 sürüm protokolünü kullanır
Test kodu şu şekildedir:
İstek 1.1 sürümü kullanır ve nihai istemci ile sunucu, iletişim için 2.0 protokolünü kullanmak için pazarlık yapar, bu nedenle nihai yanıt aşağıdaki şekilde gösterildiği gibi 2.0 sürümüdür:
Referans:
Bağlantı girişi görünür.
Bağlantı girişi görünür.
Bağlantı girişi görünür. |