2011-09-01 11 views
24

Estoy usando .NET WebRequest mientras cambio mi archivo HOSTS. Estoy observando que System.Net no respeta esos cambios, ¿cómo puedo hacerlo?¿Cómo borro el caché de DNS del cliente System.Net?

Tengo una cantidad de servidores con equilibrio de carga detrás de un único nombre de host, digamos 'ejemplo.com'. Quiero apuntar a varios de ellos de forma individual, por lo que mi programa se difícil que el código dirección IP específica de la máquina en mis 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 otra vez:

163.56.0.48 example.com 

Y creo una nueva HttpWebRequest. Cuando envío este, puedo observar en NETMON que va a la primera dirección IP (163.56.0.34) en lugar de a la segunda espera.

con puntos de parada y trazas de depuración, He verificado que el valor correcto no se escriben en el archivo hosts cada vez. Cuando intento acceder a example.com desde un navegador u otro programa, respeta el archivo HOSTS y accede a la segunda dirección IP.

Uso de NETMON He verificado que las solicitudes van directamente a la dirección IP que se muestra; no hay un proxy HTTP.

Ya que todo lo demás está cumpliendo el archivo HOSTS modificados, tengo la fuerte sospecha de que la infraestructura System.Net ha almacenado en caché la asociación anfitriona-IP de DNS para example.com. Sin embargo, no puedo encontrar ninguna referencia a este almacenamiento en caché, y no tengo forma de enjuagarlo o apagarlo.

daría la bienvenida a las instrucciones para hacer frente a la caché, sugerencias para qué otra cosa podría ser la causa de estos síntomas u otros pasos de diagnóstico propuestas que podrían ser útiles.

Respuesta

37

finalmente desenterrado el comando oscura de MSDN que soluciona este:

ServicePointManager.DnsRefreshTimeout = 0; 

Como desenrollé todas las cosas extrañas I' d intentado previamente, descubrí otra configuración que necesito junto con la anterior; en el objeto de la petición, apague keep-alive:

request.KeepAlive = false; 
+1

Establecer KeepAlive en falso dará como resultado un protocolo de enlace TCP para cada solicitud. Puede alcanzar un término medio administrando el ServicePoint.ConnectionLeaseTimeout para que pueda reutilizar algunas conexiones, mientras sigue revisando los DNS para ver posibles cambios al reconectarse. – ScottS

3

se puede utilizar para poner en marcha System.Diagnostics.Process ipconfig/flushdns

+4

lo he intentado y no funcionó - se vuelca caché DNS de la máquina, pero no caché de nivel de proceso de System.Net. – Bruce

5

Si desea mantener la DnsRefreshTimeout> 0 entonces se puede actualizar la memoria caché haciendo una llamada a:

System.Net.Dns.GetHostEntry("example.com"); 
1

Una respuesta tardía a asegúrese, pero encontré que esta solución funcionó mejor que la respuesta aceptada. En mi caso, estoy probando conexiones SQL, y no pude aplicar la respuesta existente ya que no tengo request.KeepAlive para configurar.

This page por Brian Mancini ("derp pavo") detalles de su aventura en la limpieza de la caché DNS. apoyos completos a él, sólo estoy agregando que 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); 
    } 
} 
Cuestiones relacionadas