2011-05-13 7 views
16

Tengo un código contenedor que ejecuta un conjunto de pruebas NUnit que escanean sitios web en vivo para ciertos códigos de respuesta.¿Puedo anular temporalmente la resolución de DNS dentro de una aplicación .NET?

Me gustaría ejecutar estas pruebas contra un servidor diferente. Cuando se ejecuta de forma manual, puedo hacerlo editando el archivo/etc/hosts en Windows \ System32 \ drivers y configurando temporalmente www.mysite.com a 10.0.0.whatever

¿Hay alguna forma en que pueda hacer lo mismo dentro de una aplicación de consola .NET: ¿anula temporalmente un registro DNS o intercepta de algún modo la resolución y devuelve una dirección IP diferente?

EDITAR: Esto es para probar varios servidores en una granja de servidores web. Tengo tres servidores en vivo, los cuales PIENSO que son www.example.com. Como los servidores usan encabezados de host HTTP, no puedo simplemente ejecutar una prueba contra server1, luego server2, then server3, porque una solicitud HTTP a http://server1/ NO devolverá lo mismo que una solicitud a http://www.example.com/ que se resuelve en server1 ...

+0

Creo que sería más fácil para no molestar con el DNS. En su lugar, configure la URL del destino para que se lea desde el archivo App.config. Luego, cambiaría el archivo de configuración que se lee según el entorno en el que se encuentre, que Visual Studio puede administrar para usted. – Jeff

+0

Jeff - ver edición; Necesito escanear diferentes SERVIDORES pero no puedo usar diferentes nombres de host para hablar con ellos ... –

+0

Ah, sí. Supongo que eso dificultaría las cosas. Sospeché por su representante y medallas de oro que había algo más sucediendo aquí :) – Jeff

Respuesta

7

En el pasado con C++ pude conectar a la función gethostbyname de WSOCK32.DLL y redirigir las solicitudes DNS. Usé la biblioteca Microsoft Detours para hacer eso.

En cuanto a C# He encontrado esto: http://easyhook.codeplex.com/ tal vez te ayude. Básicamente puede conectar a la función de ventana gethostbyname y ejecutar su propio código o devolver un resultado diferente (IP diferente).

La otra solución posible es editar de forma temporal (y programática) el archivo de hosts cuando la aplicación se inicia y finaliza. De tu propio código

EDIT: encontré mi antiguo código C++, tal vez le dará una pista de qué hacer.

struct hostent FAR * WSAAPI MyGetHostByName(IN const char FAR * name) 
{ 
    // Call the regular function 
    struct hostent* ret = GetHostByNameFunction(name); 
    // Check if it's the hostname you want to reroute 
    if (strcmp(host, (char*)name) == 0) 
    { 
     // Edit the IP returned by the regular gethostbyname 
     ret->h_addr_list[0] = hostIP; 
     ret->h_length = 15; 
    } 
    // Return the result 
    return ret; 
} 

Edit2: Encontrado otro enlace con el más reciente lanzamiento de easyhooks

+0

En otras palabras: no, no se puede, no dentro de .NET. –

Cuestiones relacionadas