Vereisten: De meeste websites gebruiken tegenwoordig voornamelijk de Http/1.1- en Http/2.0-versieprotocolprotocollen; voor websites die alleen de HTTP/2-protocolversie ondersteunen, zal standaard met HttpClient als verzoekversturing System.Net.Http.Http.Http.HttpRequestException worden gebruikt: Er is een fout opgetreden tijdens het verzenden van het verzoek. ---> System.IO.IOException: Kan geen gegevens lezen van de transportverbinding: De software in je host heeft een gevestigde verbinding afgebroken. ---> System.Net.Sockets.SocketException (10053): Software in je host breekt een gevestigde verbinding af. op System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError fout, Boolean forAsyncThrow).
Geschiedenis van het HTTP-protocol
Tijdlijn
HTTP/0.9
Het verouderde HTTP/0.9 was de eerste versie van het HTTP-protocol, geboren in 1989. Het is extreem eenvoudig, stelt de client in staat een GET-verzoek te sturen en ondersteunt de request-header niet. Omdat er geen protocolheader is, kan HTTP/0.9 slechts één type inhoud ondersteunen - platte tekst. De server kan alleen reageren op reeksen in HTML-formaat, niet op andere formaten. Wanneer de server klaar is met verzenden, wordt de TCP-verbinding gesloten. HTTP/0.9 heeft een typische toestandloosheid, waarbij elk bezoek onafhankelijk wordt verwerkt en wordt losgekoppeld wanneer de verwerking is voltooid. Als de gevraagde pagina niet bestaat, worden er geen foutcodes teruggegeven.
HTTP/1
HTTP/1 is een verzamelnaam voor HTTP 1.0 en HTTP 1.1, wat verwijst naar de versies van het HTTP-protocol die respectievelijk 1.0 en 1.1 zijn. HTTP 1.0 was de tweede versie van het HTTP-protocol en wordt vandaag de dag nog steeds breed gebruikt. Het heeft een aantal verbeteringen en verbeteringen aangebracht op basis van HTTP/0.9, waaronder:
Meer formaten zoals afbeeldingen, video's en binaire bestanden kunnen worden verzonden dan alleen tekst Bovenop een POST-aanvraagmethode zijn er POST-verzoekmethoden toegevoegd Het formaat van HTTP-verzoeken en -antwoorden is veranderd. Naast het datagedeelte moet elke communicatie een HTTP-header bevatten die bepaalde metadata beschrijft, d.w.z. de informatie van de request header wordt toegevoegd Toegevoegde functies zoals responsstatuscode, ondersteuning voor multi-character sets, autorisatie, cache en contentcodering Hoewel het nog steeds een stateless protocol is, kunnen lange verbindingen worden ondersteund door de header "Connection: keep-alive" aan het verzoek toe te voegen
HTTP 1.1
HTTP 1.1 is een gestandaardiseerd protocol, en HTTP 1.1 elimineert veel ambiguïteit en introduceert verschillende verbeteringen.
eigenaardigheid
Cacheverwerking, HTTP 1.1 introduceert meer cache-controlebeleid, zoals Entity tag, If-Unmodified-Since, If-Match, If-None-Match, enzovoort, en meer optionele cacheheaders om het cachebeleid te beheren. Bandbreedteoptimalisatie en het gebruik van netwerkverbindingen introduceren een bereik in de requestheader, waardoor slechts één deel van de resource kan worden opgevraagd, namelijk de statuscode 206 teruggeven, wat het voor ontwikkelaars gemakkelijker maakt om vrij te kiezen om volledig gebruik te maken van bandbreedte en links, en Range en Content-Range kunnen gebruiken om een breakpoint-hervattingsfunctie te creëren. Foutmeldingsbeheer, 24 nieuwe foutstatuscodes zijn toegevoegd in HTTP 1.1. Door de Host-header toe te voegen, kunnen verschillende domeinnamen worden geconfigureerd op servers met hetzelfde IP-adres. Ondersteuning voor lange verbindingen, HTTP 1.1 ondersteunt lange verbindingen, meerdere HTTP-verzoeken en -antwoorden kunnen worden verzonden op een TCP-verbinding, waardoor het verbruik en de vertraging van het tot stand brengen en sluiten van verbindingen wordt verminderd, en Connection:keep-alive is standaard ingeschakeld in HTTP 1.1, en algemene browsers maken het mogelijk om 6 lange verbindingen tegelijk op te zetten voor dezelfde domeinnaam. Pipelining-technologie toegevoegd om een tweede verzoek te laten versturen voordat het eerste antwoord volledig is verzonden, om de wachtrijblokkering te verbeteren, maar de volgorde van antwoorden wordt nog steeds in de volgorde van de verzoeken teruggegeven. Ondersteuning voor responschunking, door Transfer-Encoding: chunked voor chunked response in te stellen, waardoor de responsgegevens in meerdere delen kunnen worden verdeeld, en de server de buffer zo snel mogelijk kan vrijgeven om een snellere responssnelheid te bereiken.
HTTP 2.0
HTTP 2.0 heeft betere prestaties, en nu worden webpagina's steeds complexer en ontwikkelen ze zich zelfs tot unieke applicaties; de hoeveelheid mediaweergave, de grootte van scripts om de interactie te verbeteren is ook sterk toegenomen, en er wordt meer data via HTTP-verzoeken verzonden, waardoor HTTP 2.0 veel optimalisaties heeft doorgevoerd voor netwerkefficiëntie.
eigenaardigheid
Binaire Frame Splitting, HTTP 2.0 is een binair protocol in plaats van een tekstprotocol dat alle verzonden informatie splitst in kleinere berichten en frames en deze codeert in binair formaat. Multiplexen, parallelle verzoeken kunnen in dezelfde verbinding worden verwerkt, alle toegangen onder dezelfde domeinnaam komen van dezelfde TCP-verbinding, HTTP-berichten worden opgedeeld in onafhankelijke frames, en de server stelt de berichten opnieuw samen volgens identifiers en headers, waarbij de volgorde- en blokkeringsbeperkingen in HTTP 1.1 worden verwijderd. Het comprimeren van headers, die vaak vergelijkbaar zijn in een reeks verzoeken, elimineert de kosten van duplicatie en verzending van dubbele data. Server-side push kan de server proactief resources naar de client pushen zonder expliciet verzoek van de client.
HTTP 3.0
HTTP 3.0 bevindt zich momenteel in de formulerings- en testfase, is een nieuw HTTP-protocol in de toekomst, het HTTP 3.0-protocol draait bovenop het QUIC-protocol, is gebaseerd op UDP om betrouwbare transmissie te bereiken, transmissiesnelheid en transmissiebetrouwbaarheid af te wegen en te optimaliseren, het gebruik van UDP voorkomt TCP-wachtrijblokkeringsproblemen en versnelt de netwerktransmissiesnelheid, maar vereist ook een betrouwbaar transmissiemechanisme; HTTP 3.0 is geen uitbreiding van HTTP 2.0, HTTP 3.0 wordt een volledig nieuw protocol.
HttpClientHandler VS SocketsHttpHandler
De standaard berichthandler die door HttpClient wordt gebruikt in het .NET Framework en .NET Core 2.0 en eerder is HttpClientHandler.
Te beginnen met .NET Core 2.1, klassenSocketsHttpHandler biedt een hoger-niveau HTTP-netwerkklasse(bijv. HttpClient). Het gebruik van SocketsHttpHandler biedt veel voordelen:
De prestaties zijn aanzienlijk verbeterd ten opzichte van eerdere implementaties. Elimineer platformafhankelijkheden om de implementatie en service te vereenvoudigen. Bijvoorbeeld, libcurl is niet langer afhankelijk van .NET Core voor macOS en .NET Core voor Linux. Consistent gedrag over alle .NET-platforms.
In .NET 9 gebruikt HttpClientFactory SocketsHttpHandler als hoofdhandler
HttpClientFactory maakt het mogelijk om HttpClient-pijplijnen te configureren voor benoemde en getypeerde HttpMessageHandler-objecten. De binnenste handler of handler die daadwerkelijk verzoeken op het netwerk stuurt, wordt de master handler genoemd. Als deze handler niet was geconfigureerd, was deze handler altijd een HttpClientHandler. Hoewel de standaard master handler de implementatiedetails zijn, zijn er gebruikers die erop vertrouwen. Sommige gebruikers casten bijvoorbeeld de hoofdhandler naar de HttpClientHandler-instellingen zoals ClientCertificates, UseCookies en UseProxy.
Verbinden:De hyperlink-login is zichtbaar.
De globale configuratie vraagt om de HTTP-protocolversie
De code is als volgt:
DefaultRequestVersionDe standaardinstelling is HttpVersion.Version11。
De eigenschap DefaultRequestVersion specificeert de standaard HTTP-versie die gebruikt moet worden voor verzoeken die via deze HttpClient-instantie worden verzonden, wanneer het de HttpRequestMessage construeert om te verzenden, specifiek door 、、、GetStreamAsyncGetAsyncGetAsyncGetGetByteArrayAsync, PatchAsyncGetStringAsync, aan te roepen, PostAsync en PutAsync.
DefaultRequestVersion-eigenschapIs niet van toepassing op de SendAsync-methode。 De HttpRequestMessage-parameter die als parameter aan de SendAsync-methode wordt doorgegeven, heeft een eigen Version-eigenschap die de HTTP-versie aanstuurt die voor het verzoek wordt gebruikt.
Verbinden:De hyperlink-login is zichtbaar.
HttpVersionPolicy onderhandelingsbeleid
RequestVersionOrLower: Gebruik de gevraagde versie, of degradeer naar een lagere versie (maar niet hoger dan de gevraagde versie). Dit is het standaardgedrag. In eenvoudige termen is de meest gebruikte protocolversie de huidige versie, en als de huidige protocolversie niet wordt ondersteund, wordt deze gedowngraded.
RequestVersionOrHigher: Gebruik de hoogste versie die door de server wordt ondersteund, maar niet lager dan de gevraagde versie. Dat wil zeggen, upgrades zijn toegestaan, en downgrades onder de gevraagde versie zijn niet toegestaan. Eenvoudig gezegd: gebruik indien mogelijk protocollen van hogere versies voor communicatie.
RequestVersionExact: Gebruik strikt de gevraagde versie, upgrades of downgrades zijn niet toegestaan.
HttpClient gebruikt het Http/2.0-versieprotocol
De testcode is als volgt:
Het verzoek gebruikt versie 1.1, en de uiteindelijke client en server onderhandelen om het 2.0-protocol te gebruiken om te communiceren, dus het uiteindelijke antwoord is versie 2.0, zoals te zien is in de onderstaande figuur:
Referentie:
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar. |