Lors de la construction d’une application avec ASP.NET, une instance de la classe HttpClient est utilisée pour effectuer une requête HTTP. Utiliser HttpClient peut sembler simple. Cependant, certains problèmes potentiels ne sont pas remarqués avant que l’application soit sous forte charge.
Problèmes liés à la classe HttpClient originale fournie dans .NET :La connexion hyperlientérée est visible.
HttpClient, tout en implémentant IDisposable, déclarer et instancier dans l’instruction using n’est pas une opération préférée, carLors de la libération d’un objet HttpClient, le socket sous-jacent ne le fait pasimmédiatementlibérer, ce qui peut causer des problèmes d’épuisement de la douille.
Le problème ne vient pas vraiment de HttpClient lui-même, mais du constructeur par défaut d’HttpClient, car il crée une nouvelle instance réelle de HttpMessageHandler avec les problèmes d'« épuisement de sockets » et de changements DNS mentionnés plus haut.
Création directe d’un HttpClient (utilisation incorrecte)
Instanciez directement l’objet HttpClient, et ajoutez use pour garantir l’appel à la méthode Dispos, le code est le suivant :
Appelez l’interface 5 fois, envoyez une requête HTTP via HttpClient, et vérifiez la connexion réseau avec la commande suivante :
Vous pouvez voir que lorsque le client Http est libéré, la connexion entre l’ordinateur local et le serveur cible estTIME_WAITEn cas de forte concurrence, l’erreur sera rapportée comme suit :
Impossible de se connecter au serveur distant
System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted.
Pour les questions, vous pouvez également vous référer à :
Créer un HttpClinet avec IHttpClientFactory (utilisation correcte)
En utilisant l’injection de dépendance DI, IHttpClientFactory est le même que HttpLinet, qui est créé avec IHttpClientFactory.
Ajoutez le service au fichier de démarrage, le code est le suivant :
Le code du contrôleur HomeController est le suivant :
Nous utilisons également HttpClinet pour envoyer 5 requêtes via l’interface d’appel, et la machine n’établit qu’une connexion avec le serveur cible, la connexion étant réutilisée pendant le processus de requête. Comme montré ci-dessous :
IHttpClientFactory regroupe les instances HttpMessageHandler créées en usine dans un pool afin de réduire la consommation de ressources. Lorsque vous créez une nouvelle instance HttpClient, vous pouvez réutiliser l’instance HttpMessageHandler dans le pool si la durée de vie n’est pas expirée.
{ « Vie » : « Célibataire », « ServiceType » : « System.Net.Http.IHttpClientFactory », « ImplementationType » : « Microsoft.Extensions.Http.DefaultHttpClientFactory » }, { « Vie » : « Célibataire », « ServiceType » : « System.Net.Http.IHttpMessageHandlerFactory », « ImplementationType » : « Microsoft.Extensions.Http.DefaultHttpClientFactory » } IHttpClientFactory est implémenté par défaut sous le nom de DefaultHttpClientFactory, avec l’adresse du code source :La connexion hyperlientérée est visible.
En utilisant IHttpClientFactory dans une application compatible DI, vous pouvez éviter :
- Résolvez le problème d’épuisement des ressources en partageant l’instance HttpMessageHandler.
- Résoudre l’impasse DNS en bouclant périodiquement les instances HttpMessageHandler.
De plus, il existe d’autres moyens de résoudre les problèmes ci-dessus en utilisant des instances SocketsHttpHandler à longue durée de vie.
- Créez une instance de SocketsHttpHandler au démarrage de l’application et utilisez-la tout au long du cycle de vie de l’application.
- Configurez PooledConnectionLifetime à la valeur appropriée en fonction du temps de rafraîchissement DNS.
- Créez une instance de HttpClient en utilisant un nouveau HttpClient (handler, disposeHandler : false) selon les besoins.
L’approche ci-dessus résout les problèmes de gestion des ressources de manière similaire à IHttpClientFactory.
- SocketsHttpHandler entre les instances HttpClientConnexions partagées。 Ce partage empêche l’épuisement des douilles.
- SocketsHttpHandler boucle les connexions en fonction de PooledConnectionLifetime pour éviter la stagnation du DNS.
Pour plus d’utilisation et de configuration, veuillez consulter :
La connexion hyperlientérée est visible.
La connexion hyperlientérée est visible.
|