Požiadavky: Väčšina webových stránok teraz používa hlavne protokoly verzií Http/1.1 a Http/2.0, pre weby, ktoré podporujú iba verziu protokolu HTTP/2, používajú HttpClient na odosielanie požiadaviek ako predvolený systém System.Net.Http.Http.HttpRequestException: Pri odosielaní požiadavky došlo k chybe. ---> System.IO.IOException: Nemožné čítať dáta z transportného spojenia: Softvér vo vašom hostiteľovi prerušil nadviazané spojenie. ---> System.Net.Sockets.SocketException (10053): Softvér vo vašom hostiteľovi preruší nadviazané spojenie. at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, Boolean forAsyncThrow).
História HTTP protokolu
Časová os
HTTP/0.9
Zastaralý HTTP/0.9 bol prvou verziou protokolu HTTP, ktorá vznikla v roku 1989. Je mimoriadne jednoduchý, umožňuje klientovi odoslať GET požiadavku a nepodporuje hlavičku požiadavky. Keďže neexistuje protokolová hlavička, HTTP/0.9 môže podporovať len jeden typ obsahu – obyčajný text. Server dokáže reagovať len na reťazce vo formáte HTML, nie v iných formátoch. Keď server ukončí odosielanie, TCP spojenie sa uzavrie. HTTP/0.9 má typický bezstavový stav, kde sa každá návšteva spracováva nezávisle a odpojí sa po dokončení spracovania. Ak požadovaná stránka neexistuje, nevracia sa žiadne chybové kódy.
HTTP/1
HTTP/1 je kolektívny termín pre HTTP 1.0 a HTTP 1.1, ktorý označuje verzie HTTP protokolu 1.0 a 1.1. HTTP 1.0 bola druhou verziou HTTP protokolu a dodnes je široko používaná. Priniesol niekoľko vylepšení a vylepšení založených na HTTP/0.9, vrátane:
Viac formátov, ako sú obrázky, videá, binárne súbory je možné posielať aj viac než len text Okrem toho boli pridané metódy POST požiadaviek Zmenil som formát HTTP požiadaviek a odpovedí. Okrem dátovej časti musí každá komunikácia obsahovať HTTP hlavičku, ktorá popisuje niektoré metadáta, t. j. pridáva sa informácia o hlavičke požiadavky Pridané funkcie ako kód stavu odpovede, podpora viacnásobných znakov, autorizácia, cache a kódovanie obsahu Aj keď ide stále o bezstavový protokol, dlhé pripojenia je možné podporiť pridaním hlavičky "Connection: keep-alive" k požiadavke
HTTP 1.1
HTTP 1.1 je štandardizovaný protokol a HTTP 1.1 odstraňuje veľa nejasností a prináša niekoľko vylepšení.
zvláštnosť
Spracovanie cache, HTTP 1.1 zavádza viac pravidiel riadenia cache, ako sú Entity tag, If-Unmodified-Since (If-Unmodified-Since), If-Match, If-None-Match a podobne, a ďalšie voliteľné cache hlavičky na ovládanie cache politiky. Optimalizácia šírky pásma a využívanie sieťových pripojení zavádzajú rozsah v hlavičke požiadavky, ktorý umožňuje požadovať iba jednu časť zdroja, a to vrátenie stavového kódu 206, čo uľahčuje vývojárom slobodne si vybrať plné využitie šírky pásma a prepojení, a môžu použiť rozsah a rozsah obsahu na vytvorenie funkcie obnovenia bodu prerušenia. Správa hlásení chýb, v HTTP 1.1 bolo pridaných 24 nových kódov stavov chýb. Pridaním hlavičky Host je možné nastaviť rôzne doménové mená na serveroch s rovnakou IP adresou. Podporuje dlhé spojenia, HTTP 1.1 podporuje dlhé spojenia, viaceré HTTP požiadavky a odpovede môžu byť prenášané cez TCP spojenie, čím sa znižuje spotreba a oneskorenie pri nadväzovaní a zatváraní spojení, a Connection:keep-alive je predvolene zapnutý v HTTP 1.1, pričom bežné prehliadače umožňujú vytvoriť 6 dlhých odkazov naraz pre rovnaké doménové meno. Pridaná technológia potrubia, ktorá umožňuje odoslať druhú požiadavku pred úplným odoslaním prvej odpovede, aby sa zlepšilo blokovanie fronty, ale poradie odpovedí sa stále vracia v poradí požiadaviek. Podporujte rozdelenie odpovede nastavením Transfer-Encoding: chunked pre chunked response, čo umožňuje rozdeliť dáta odpovede na viacero častí a server môže uvoľniť buffer čo najskôr, aby dosiahol vyššiu rýchlosť odozvy.
HTTP 2.0
HTTP 2.0 má lepší výkon a webové stránky sa stávajú čoraz zložitejšími, dokonca sa vyvíjajú do unikátnych aplikácií, množstvo prehrávania médií, veľkosť skriptov na zlepšenie interakcie sa tiež výrazne zvýšila a viac dát sa prenáša cez HTTP požiadavky, takže HTTP 2.0 priniesol množstvo optimalizácií pre efektivitu siete.
zvláštnosť
Binárne rozdelenie rámcov, HTTP 2.0 je binárny protokol, nie textový protokol, ktorý rozdeľuje všetky prenášané informácie na menšie správy a rámce a kóduje ich v binárnom formáte. Multiplexujúce, paralelné požiadavky môžu byť spracované v rovnakom spojení, všetky prístupy pod rovnakým doménovým menom sú z rovnakého TCP spojenia, HTTP správy sú rozdelené na nezávislé rámce a server znovu zostavuje správy podľa identifikátorov a hlavičiek, čím sa odstraňujú obmedzenia poradia a blokovania v HTTP 1.1. Kompresia hlavičiek, ktoré sú často podobné v sérii požiadaviek, znižuje náklady na duplikáciu a prenos duplicitných dát. Server-side push, server môže proaktívne posielať zdroje klientovi bez explicitnej požiadavky klienta.
HTTP 3.0
HTTP 3.0 je momentálne vo fáze formulácie a testovania, je to nový budúci HTTP protokol, HTTP 3.0 beží nad QUIC protokolom, je založený na UDP na dosiahnutie spoľahlivého prenosu, kompromis medzi rýchlosťou prenosu a spoľahlivosťou prenosu a optimalizáciou, použitie UDP zabráni problému blokovania TCP fronty a zrýchli rýchlosť prenosu v sieti, ale zároveň vyžaduje spoľahlivý mechanizmus prenosu. HTTP 3.0 nie je rozšírením HTTP 2.0, HTTP 3.0 bude úplne nový protokol.
HttpClientHandler VS SocketsHttpHandler
Predvolený správny handler používaný HttpClient v .NET Frameworku a .NET Core 2.0 a starších je HttpClientHandler.
Začínajúc s .NET Core 2.1, triedySocketsHttpHandler poskytuje vyššiu úroveň HTTP sieťovej triedy(napr. HttpClient). Používanie SocketsHttpHandler ponúka mnoho výhod:
Výkon sa výrazne zlepšil v porovnaní s predchádzajúcimi implementáciami. Odstrániť závislosti na platforme na zjednodušenie nasadenia a služieb. Napríklad libcurl už nezávisí od .NET Core pre macOS a .NET Core pre Linux. Konzistentné správanie naprieč všetkými .NET platformami.
V .NET 9 používa HttpClientFactory ako hlavný handler SocketsHttpHandler
HttpClientFactory umožňuje konfiguráciu HttpClient pipeline pre pomenované a typované objekty HttpMessageHandler. Najvnútornejší handler alebo handler, ktorý skutočne odosiela požiadavky do siete, sa nazýva master handler. Ak nebol nakonfigurovaný, tento handler bol predtým vždy HttpClientHandler. Kým predvoleným hlavným handlerom sú detaily implementácie, niektorí používatelia sa naň spoliehajú. Napríklad niektorí používatelia prenášajú hlavný handler do nastavení HttpClientHandler, ako sú ClientCertificates, UseCookies a UseProxy.
Väzba:Prihlásenie na hypertextový odkaz je viditeľné.
Globálna konfigurácia požaduje verziu HTTP protokolu
Kód je nasledovný:
DefaultRequestVersionPredvolené nastavenie je HttpVersion.Version11。
Vlastnosť DefaultRequestVersion špecifikuje predvolenú verziu HTTP, ktorá sa použije pre požiadavky odosielané pomocou tejto inštancie HttpClient, keď konštruuje HttpRequestMessage na odoslanie, konkrétne volaním 、、、GetStreamAsyncGetAsyncGetByteArrayAsync, PatchAsyncGetStringAsync, PostAsync a PutAsync.
Vlastnosť DefaultRequestVersionNeplatí pre metódu SendAsync。 Parameter HttpRequestMessage odovzdaný metóde SendAsync ako parameter má vlastnosť Version, ktorá riadi HTTP verziu použitú pre požiadavku.
Väzba:Prihlásenie na hypertextový odkaz je viditeľné.
Vyjednávacia politika HttpVersionPolicy
RequestVersionOrLower: Použite požadovanú verziu, alebo znížte na nižšiu verziu (ale nie vyššiu ako požadovaná verzia). Toto je predvolené správanie. Jednoducho povedané, najpoužívanejšou verziou protokolu je aktuálna verzia, a ak nie je podporovaná, bude degradovaná.
RequestVersionOrHigher: Použite najvyššiu verziu podporovanú serverom, ale nie nižšiu ako požadovaná verzia. To znamená, že upgrady sú povolené a downgrade pod požadovanú verziu nie sú povolené. Jednoducho povedané, používajte vyššie verzie protokolov na komunikáciu, kedykoľvek je to možné.
RequestVersionExact: Striktne používajte požadovanú verziu, nie sú povolené žiadne vylepšenia ani degradácie.
HttpClient používa protokol verzie Http/2.0
Testovací kód je nasledovný:
Požiadavka používa verziu 1.1 a konečný klient a server vyjednávajú, že použijú protokol 2.0 na komunikáciu, takže konečná odpoveď je verzia 2.0, ako je znázornené na obrázku nižšie:
Referencia:
Prihlásenie na hypertextový odkaz je viditeľné.
Prihlásenie na hypertextový odkaz je viditeľné.
Prihlásenie na hypertextový odkaz je viditeľné. |