我有一些包装代码,它运行一组NUnit测试,扫描实时网站以获取某些响应代码。
我想针对不同的服务器运行这些测试。手动运行时,我可以通过编辑Windows \ System32 \ drivers中的/ etc / hosts文件并暂时将www.mysite.com设置为10.0.0.whatever
来完成此操作。我有什么方法可以在.NET控制台应用程序中做同样的事情 - 暂时覆盖DNS记录或以某种方式截取分辨率并返回不同的IP地址?
编辑:这用于测试Web场中的多个服务器。我有三个实时服务器,所有这些都认为它们是www.example.com。因为服务器使用HTTP主机头,所以我不能只针对server1,然后是server2,然后是server3运行测试,因为对http://server1/的HTTP请求不会返回与http://www.example.com/的请求相同的内容。已经解决了server1 ...
答案 0 :(得分:7)
在过去使用C ++时,我能够挂钩到WSOCK32.DLL的gethostbyname函数并重新路由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