18

我有一些运行一组 NUnit 测试的包装代码,这些测试扫描实时网站以获取某些响应代码。

我想针对不同的服务器运行这些测试。手动运行时,我可以通过编辑 Windows\System32\drivers 中的 /etc/hosts 文件并将 www.mysite.com 临时设置为 10.0.0.whatever 来完成此操作

有什么方法可以在 .NET 控制台应用程序中执行相同的操作 - 暂时覆盖 DNS 记录或以某种方式拦截解析并返回不同的 IP 地址?

编辑:这是用于测试网络场中的多台服务器。我有三个实时服务器,所有这些都认为它们是 www.example.com。因为服务器使用 HTTP 主机标头,所以我不能只对 server1、server2、server3 运行测试,因为对 http://server1/的 HTTP 请求不会返回与对http://的请求相同的内容www.example.com/已解析为 server1 ...

4

1 回答 1

7

在过去使用 C++ 时,我能够连接到 WSOCK32.DLL 的 gethostbyname 函数并重新路由 DNS 请求。我使用 Microsoft Detours 库来做到这一点。

至于 C#,我发现了这个:http ://easyhook.codeplex.com/也许它会帮助你。基本上,您可以连接到gethostbynamewindows 函数并执行您自己的代码或返回不同的结果(不同的 IP)。

另一种可能的解决方案是在应用程序启动和结束时临时(并以编程方式)编辑主机文件。来自您自己的代码。

编辑:我找到了我的旧 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的另一个链接

于 2011-05-13T13:47:22.270 回答