【问题标题】:.NET caches DNS forever in Server 2008.NET 在 Server 2008 中永久缓存 DNS
【发布时间】:2013-03-04 23:13:34
【问题描述】:

我遇到了一个问题,即我的 .NET Web 请求总是针对给定的 CNAME 访问相同的 IP。 CNAME 绑定到多个 IP 地址,每次发生 DNS 查找时,这些 IP 地址都会以随机顺序返回(通过运行 nslookup 确认)。

我写了一个简单的应用来测试这个:

    public void TestDNS()
    {
        while (true)
        {
            var ipAddress = Dns.GetHostAddresses("mywebsite.com").First().ToString();

            Console.WriteLine(string.Format("Current: '{0}' at: '{1}'", ipAddress, DateTime.Now.ToLongTimeString()));

            Thread.Sleep(1000);
        }
    }

我已在 Server 2008 Datacenter、Server 2008 R2 Datacenter、Server 2012、Windows 7 和 Windows 8 上运行此应用程序。所有计算机都有可用的最新更新和服务包。

唯一失败的机器是 Server 2008。其他机器大约每分钟切换一次 IP 地址(TTL 为 1 分钟)。 Server 2008 从不切换(运行了一个多小时)。

需要明确的是,在机器上运行 nslookup 和其他工具似乎表明 DNS 正在返回我所期望的内容。此问题似乎特定于 Server 2008 上的 .NET。

我已尝试此相关answer 中列出的项目,但没有成功。

有什么想法吗?

【问题讨论】:

  • 能否让 DNS 服务器为每次调用返回一组完全不同的 IP 地址?这将告诉您是否正在缓存项目,或者是否由于某种原因运行时只是对返回的值进行排序。
  • 好主意@JimMischel。我尝试在 .NET 应用程序运行后更改 DNS 记录,但没有任何改变。它似乎没有发现任何 DNS 更改(即永久缓存)。我发现的唯一帮助是更新主机文件。如果我这样做,它会更新正在运行的 .NET 应用程序中的 DNS。
  • 方法 GetHostAddresses() 返回一个 IPAddress 类型的数组。看我的回答。
  • 我看到了类似的问题。我知道这是一个老问题,但服务器是否托管在云中(如果是的话)?
  • @TheCloudlessSky 祝你好运。如果您在下面错过了它,我使用这个应用程序来解决我们服务器上的问题:github.com/reustmd/HostFileUpdater

标签: .net dns windows-server-2008 .net-4.5


【解决方案1】:

作为解决方法,ping 报告是否存在相同问题?

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

如果您愿意接受变通办法,另一种可能的解决方案是搜索解析主机名的第 3 方库/代码或通过 [System.Diagnostics.Process();] 调用命令行。

希望对您有所帮助。

【讨论】:

  • 谢谢。我现在所做的解决方法是通过 .NET 进程命令调用 wslookup 并更新主机文件。这是一个 hack,但它很简单,而且很有效。最终我将升级到没有这个问题的 Server 2012。
  • 这是代码,它基本上需要一个目标 url,并将 IP 分配给主机文件中任意数量的主机名。 github.com/reustmd/HostFileUpdater/tree/master/HostFileUpdater
  • 方法 GetHostAddresses() 返回一个 IPAddress 类型的数组;看我的回答。
【解决方案2】:

方法GetHostAddresses()返回一个IPAddress类型的数组。

返回值

类型:System.Net.IPAddress[]

IPAddress 类型的数组,用于保存主机的 IP 地址 由 hostNameOrAddress 参数指定。

将您的 var 更改为 IPAddress 数组。示例如下:

public static void DoGetHostAddresses(string hostname)
{
    IPAddress[] ips;

    ips = Dns.GetHostAddresses(hostname);

    Console.WriteLine("GetHostAddresses({0}) returns:", hostname);

    foreach (IPAddress ip in ips)
    {
        Console.WriteLine("    {0}", ip);
    }
}

更多详情请见this page

【讨论】:

    【解决方案3】:

    您正在进行递归查询。如果您不希望 DNS 服务器缓存任何递归查询,请在

    处创建值为 0x0 的新 DWORD "MaxCacheTTL"

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNS\Parameters

    【讨论】:

      【解决方案4】:

      您是否在所有机器上运行相同的 .Net 环境,即您的代码被编译到相同的目标(x86 或 x64)和相同的 .Net 框架 2.0 或 3.5 或 4.0

      【讨论】:

      • 是的。我将 exe 和 DLL 复制并粘贴到不同的机器上。每个操作系统都是 64 位的。
      • 我认为这并不意味着所有人都具有相同的框架stackoverflow.com/questions/7084028/…
      • 无论哪种方式,我认为这是框架集成的.Net框架中的一个错误,应该向微软报告,但他们没有错误报告门户:(
      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      相关资源
      最近更新 更多