Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 9666|Antwoord: 7

[Bron] ASP.NET Core (XV) gebruikt HttpClient om HTTP-verzoeken te verzenden

[Link kopiëren]
Geplaatst op 14-05-2022 19:37:21 | | | |
Bij het bouwen van een applicatie met ASP.NET wordt een instantie van de HttpClient-klasse gebruikt om een HTTP-verzoek te doen. Het gebruik van HttpClient lijkt misschien eenvoudig. Sommige mogelijke problemen worden echter pas opgemerkt als de applicatie zwaar belast wordt.

Problemen met betrekking tot de originele HttpClient-klasse die in .NET werd geleverd:De hyperlink-login is zichtbaar.

HttpClient, bij het implementeren van IDisposable, is het declareren en instantiëren ervan in de using statement geen voorkeursbewerking, omdatBij het vrijgeven van een HttpClient-object doet de onderliggende socket dat nietonmiddellijkloslaten, wat problemen met socketuitputting kan veroorzaken.

Het probleem ligt niet echt bij HttpClient zelf, maar bij de standaardconstructor van HttpClient, omdat het een nieuwe echte HttpMessageHandler-instantie aanmaakt met de hierboven genoemde "socket exhaustion" en DNS-wijzigingsproblemen.



HttpClient direct aanmaken (onjuiste gebruik)

Instantiat het HttpClient-object direct en voeg toe met behulp om de aanroep van de Dispose-methode te garanderen, de code is als volgt:

Bel de interface vijf keer, stuur een HTTP-verzoek met HttpClient en controleer de netwerkverbinding met het volgende commando:

Je kunt zien dat wanneer de HttpClient wordt vrijgegeven, de verbinding tussen de lokale computer en de doelserver isTIME_WAITIn het geval van hoge gelijktijdigheid wordt de fout als volgt gerapporteerd:

Kan geen verbinding maken met de externe server
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.


Voor vragen kunt u ook verwijzen naar:

Verkeerd gebruiken van HttpClinet kan je software kapot maken
https://www.itsvse.com/thread-10310-1-1.html
Maak een HttpClinet aan met IHttpClientFactory (correct gebruik)

Met DI-afhankelijkheidsinjectie is IHttpClientFactory hetzelfde als HttpLinet, dat wordt gemaakt met IHttpClientFactory.

Voeg de service toe aan het opstartbestand, de code is als volgt:

De HomeController-controllercode is als volgt:

We gebruiken ook HttpClinet om 5 verzoeken via de oproepinterface te sturen, en de machine legt alleen verbinding met de doelserver, waarna de verbinding tijdens het verzoekproces wordt hergebruikt. Zoals hieronder getoond:



IHttpClientFactory poolt fabrieksgemaakte HttpMessageHandler-instanties in een pool om het resourceverbruik te verminderen. Wanneer je een nieuwe HttpClient-instantie aanmaakt, mag je de HttpMessageHandler-instantie opnieuw gebruiken in de pool als de levensduur nog niet is verlopen.

{
    "Lifetime": "Singleton",
    "ServiceType": "System.Net.Http.IHttpClientFactory",
    "ImplementatieType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  },
  {
    "Lifetime": "Singleton",
    "ServiceType": "System.Net.Http.IHttpMessageHandlerFactory",
    "ImplementatieType": "Microsoft.Extensions.Http.DefaultHttpClientFactory"
  }
IHttpClientFactory is standaard geïmplementeerd als DefaultHttpClientFactory, met het broncodeadres:De hyperlink-login is zichtbaar.

Door IHttpClientFactory te gebruiken in een DI-geschikte applicatie, kun je het volgende vermijden:

  • Los het probleem van resource-uitputting op door de HttpMessageHandler-instantie te delen.
  • Los DNS-veroudering op door periodiek door HttpMessageHandler-instanties te lopen.


Daarnaast zijn er andere manieren om bovenstaande problemen op te lossen met behulp van SocketsHttpHandler-instanties met een lange levensduur.

  • Maak een instantie van SocketsHttpHandler aan bij het opstarten van de app en gebruik deze gedurende de hele levenscyclus van de app.
  • Configureer PooledConnectionLifetime op de juiste waarde op basis van de DNS-verversingstijd.
  • Maak een instantie van HttpClient aan met de nieuwe HttpClient(handler, disposeHandler: false) indien nodig.


De bovenstaande aanpak lost resource managementproblemen op een vergelijkbare manier op als IHttpClientFactory.

  • SocketsHttpHandler tussen de HttpClient-instantiesGedeelde verbindingen。 Dit delen voorkomt dat de socket wordt uitputt.
  • SocketsHttpHandler sluit verbindingen op basis van PooledConnectionLifetime om veroudering van DNS te voorkomen.


Voor meer gebruik en configuratie, zie alstublieft:

De hyperlink-login is zichtbaar.
De hyperlink-login is zichtbaar.





Vorig:Verkeerd gebruiken van HttpClient kan je software kapot maken
Volgend:jQuery Datatables internationalisatie-plugin
 Huisbaas| Geplaatst op 14-05-2022 19:38:14 |
recensie

ASP.NET Core (veertien) is gebaseerd op de SkiaSharp-afbeelding captcha
https://www.itsvse.com/thread-10287-1-1.html

ASP.NET Core (XIII) om te bepalen of het een Ajax-verzoek is of niet
https://www.itsvse.com/thread-10284-1-1.html

ASP.NET Core (twaalf) front-end JS, CSS-bundling en compressie
https://www.itsvse.com/thread-10282-1-1.html

ASP.NET Core (XI) eindpuntroute voegt middleware toe om alle DI-diensten weer te geven
https://www.itsvse.com/thread-10269-1-1.html

ASP.NET Gedetailleerde uitleg van configuratieprioriteiten in Core(10).
https://www.itsvse.com/thread-10265-1-1.html

ASP.NET Gedetailleerde uitleg van de middleware middleware van Core (9).
https://www.itsvse.com/thread-9647-1-1.html

ASP.NET Gedetailleerde uitleg van Core Middleware
https://www.itsvse.com/thread-8126-1-1.html

ASP.NET put van de standaardparameters van de Swagger UI in Core(8).
https://www.itsvse.com/thread-9640-1-1.html

ASP.NET Kern (7) Diepgaande analyse van de broncode van het framework
https://www.itsvse.com/thread-9601-1-1.html

ASP.NET Core (VI) DI verkrijgt handmatig de methode om objecten te injecteren
https://www.itsvse.com/thread-9595-1-1.html

ASP.NET Core (vijf) is gebaseerd op CAP-gedistribueerde transacties
https://www.itsvse.com/thread-9593-1-1.html

ASP.NET Core(4)-filter uniforme ModelState-modelvalidatie
https://www.itsvse.com/thread-9589-1-1.html

ASP.NET Core (iii) Maakt dynamisch instanties aan met behulp van ActivatorUtilities
https://www.itsvse.com/thread-9488-1-1.html

ASP.NET Core (2) Herstart de applicatie via code
https://www.itsvse.com/thread-9480-1-1.html

ASP.NET Core (1) gebruikt Redis-caching
https://www.itsvse.com/thread-9393-1-1.html
 Huisbaas| Geplaatst op 14-05-2022 19:41:13 |
Geplaatst op 14-05-2022 22:36:06 |
Leer het
Geplaatst op 19-05-2022 09:45:12 |
Hier komt het, bekijk het vervolg
Geplaatst op 18-08-2022 16:13:45 |
Geweldig leren en leren
 Huisbaas| Geplaatst op 24-06-2023 13:07:32 |
.NET/C# Eenvoudige analyse van de broncode van de HttpClient
https://www.itsvse.com/thread-10617-1-1.html
 Huisbaas| Geplaatst op 05-09-2024 14:35:55 |
Bekijk de broncode van HttpClientFactoryServiceCollectionCollectionExtensions

De standaardimplementatie van IHttpClientFactory isDefaultHttpClientFactory, zoals getoond in de onderstaande figuur:



De CreateClient-methode in DefaultHttpClientFactory instantieert het HttpClient-objectdisposeHandler: false, zoals getoond in de onderstaande figuur:



Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com