是否可以暂时覆盖 .NET 应用程序中的 DNS 解析

本文关键字:应用程序 DNS 解析 NET 覆盖 是否 | 更新日期: 2023-09-27 17:56:34

我有一些包装代码,它运行一组 NUnit 测试,扫描实时网站以查找某些响应代码。

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

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

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

是否可以暂时覆盖 .NET 应用程序中的 DNS 解析

过去有了

C++,我能够钩住WSOCK32。DLL 的 gethostbyname 函数和重新路由 DNS 请求。我使用Microsoft Detours库来做到这一点。

至于C#,我发现了这个:http://easyhook.codeplex.com/也许它会帮助你。基本上,您可以挂接到 gethostbyname 窗口函数并执行自己的代码或返回不同的结果(不同的 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的另一个链接