我可以在.NET应用程序中临时覆盖DNS解析吗?

19

我有一些包装代码,运行一组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请求将不会返回与解析为server1的http://www.example.com/相同的内容...


我认为不必费心处理DNS会更容易。相反,将目标的URL设置为从App.config文件中读取。然后,根据所处的环境切换要读取的配置文件 - 这是Visual Studio可以为您管理的。 - Jeff
Jeff - 看编辑;我需要扫描不同的服务器,但不能使用不同的主机名与它们通信... - Dylan Beattie
啊,是的。我想那可能会使事情变得困难。我从您的声誉和金牌中猜测到这里还有其他事情 :) - Jeff
1个回答

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;
}

编辑2:发现另一个链接有更新的easyhooks版本。


换句话说:不,你不能 - 在.NET内部是不行的。 - Stefan Steiger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接