Можно ли временно переопределить разрешение DNS в приложении .NET? - PullRequest
16 голосов
/ 13 мая 2011

У меня есть некоторый код-обертка, который запускает набор тестов NUnit, которые сканируют живые веб-сайты на предмет определенных кодов ответов.

Я бы хотел запустить эти тесты на другом сервере. При запуске вручную я могу сделать это, отредактировав файл / etc / hosts в Windows \ System32 \ drivers и временно установив для www.mysite.com значение 10.0.0.wh независимо

Есть ли способ сделать то же самое в консольном приложении .NET - временно переопределить запись DNS или каким-то образом перехватить разрешение и вернуть другой IP-адрес?

РЕДАКТИРОВАТЬ: Это для тестирования нескольких серверов в веб-ферме. У меня есть три живых сервера, каждый из которых ДУМАЕТ, что они www.example.com. Поскольку серверы используют заголовки узлов HTTP, я не могу просто запустить тест для server1, затем server2, затем server3, потому что HTTP-запрос к http://server1/ НЕ вернет то же самое, что и запрос к http://www.example.com/ это разрешено на server1 ...

1 Ответ

7 голосов
/ 13 мая 2011

В прошлом с C ++ я мог подключиться к функции gethostbyname WSOCK32.DLL и перенаправить DNS-запросы. Для этого я использовал библиотеку Microsoft Detours.

Что касается C #, я нашел это: http://easyhook.codeplex.com/ возможно, это поможет вам. По сути, вы можете подключиться к функции gethostbyname windows и выполнить свой собственный код или вернуть другой результат (другой IP).

Другое возможное решение - временно (и программно) отредактировать файл hosts, когда приложение запускается и заканчивается. Из вашего собственного кода.

РЕДАКТИРОВАТЬ: Я нашел свой старый код C ++, может быть, он даст вам подсказку, что делать.

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: найдена другая ссылка с более новым выпуском easyhooks

...