c# - ¿Cómo borro la caché DNS del cliente System.Net?
hosts-file (4)
Estoy usando .NET WebRequest mientras cambio mi archivo HOSTS. Estoy observando que System.Net no respeta esos cambios. ¿Cómo puedo hacerlo?
Tengo una cantidad de servidores con carga equilibrada detrás de un solo nombre de host, digamos ''example.com''. Quiero apuntar a varios de ellos individualmente, por lo que mi programa codificará la dirección IP específica de la máquina en mi archivo HOSTS antes de enviar una solicitud a example.com:
163.56.0.34 example.com
Para el primer servidor y la primera solicitud, esto funciona bien. Entonces mi programa cambia el archivo HOSTS de nuevo:
163.56.0.48 example.com
Y creo un nuevo HttpWebRequest. Cuando envío este apagado, puedo observar en NETMON que va a la primera dirección IP (163.56.0.34) en lugar de a la segunda.
Al usar puntos de interrupción y seguimientos de depuración, he verificado que el valor correcto se escribe en el archivo HOSTS cada vez. Cuando intento acceder a example.com desde un navegador u otro programa, respeta el archivo HOSTS y va a la segunda dirección IP.
Usando NETMON he verificado que las solicitudes van directamente a la dirección IP que se muestra; no hay proxy HTTP.
Como todo lo demás respeta el archivo HOSTS modificado, sospecho que la infraestructura de System.Net ha guardado en caché la asociación de host-IP de DNS para example.com. Sin embargo, no puedo encontrar ninguna referencia a este almacenamiento en caché, y no conozco ninguna forma de vaciarlo o desactivarlo.
Me gustaría recibir instrucciones para tratar con el caché, sugerencias sobre qué otra cosa podría estar causando estos síntomas u otros pasos de diagnóstico propuestos que podrían ser útiles.
Finalmente desenterré el comando oscuro de MSDN que corrige esto:
ServicePointManager.DnsRefreshTimeout = 0;
Mientras desenrollaba todas las cosas raras que había probado anteriormente, descubrí otro ajuste que necesito junto con el anterior; en el objeto de solicitud, desactive keep-alive:
request.KeepAlive = false;
Si desea mantener el DnsRefreshTimeout> 0, puede actualizar el caché haciendo una llamada a:
System.Net.Dns.GetHostEntry("example.com");
Una respuesta tardía para estar seguro, pero encontré que esta solución funcionó mejor que la respuesta aceptada. En mi escenario, estoy probando conexiones SQL y no pude aplicar la respuesta existente ya que no tengo ninguna request.KeepAlive
. request.KeepAlive
para establecer.
Esta página de Brian Mancini ("derp turkey") detalla su aventura en limpiar el caché de DNS. Apoyos completos para él, solo estoy agregando su solución aquí:
public class DnsUtils
{
[DllImport("dnsapi.dll", EntryPoint="DnsFlushResolverCache")]
static extern UInt32 DnsFlushResolverCache();
[DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCacheEntry_A")]
public static extern int DnsFlushResolverCacheEntry(string hostName);
public static void FlushCache()
{
DnsFlushResolverCache();
}
public static void FlushCache(string hostName)
{
DnsFlushResolverCacheEntry(hostName);
}
}
podría usar System.Diagnostics.Process para iniciar ipconfig / flushdns