【问题标题】:Can I temporarily override DNS resolution within a .NET application?我可以在 .NET 应用程序中临时覆盖 DNS 解析吗?
【发布时间】:2011-08-24 23:06: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 请求不会返回与解析到 server1 的对 http://www.example.com/ 的请求相同的内容...

【问题讨论】:

  • 我认为不打扰 DNS 会更容易。相反,将目标的 URL 设置为从 App.config 文件中读取。然后,您将根据您所处的环境切换读取哪个配置文件 - Visual Studio 可以为您管理。
  • 杰夫 - 见编辑;我需要扫描不同的服务器,但不能使用不同的主机名与他们交谈......
  • 啊,是的。我想这会让事情变得困难。我从你的代表和金牌怀疑这里还有其他事情发生:)

标签: c# nunit dns hosts-file ipconfig


【解决方案1】:

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

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

【讨论】:

  • 换句话说:不,你不能——不在 .NET 中。
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 2013-07-22
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多