如何清除 System.Net 客户端 DNS 缓存?

问题描述 投票:0回答:5

我在更改 HOSTS 文件时使用 .NET WebRequest。我发现 System.Net 不接受这些更改 - 我怎样才能让它这样做?

我有许多服务器在单个主机名后面进行负载平衡,比方说“example.com”。我想单独定位其中的几个,因此我的程序将在向 example.com 发送请求之前将机器特定的 IP 地址硬编码到我的 HOSTS 文件中:

163.56.0.34  example.com

对于第一个服务器和第一个请求,这工作得很好。然后我的程序再次更改HOSTS文件:

163.56.0.48  example.com

我创建了一个新的 HttpWebRequest。当我发送这个 IP 地址时,我可以在 NETMON 中观察到它发送到第一个 IP 地址 (163.56.0.34),而不是预期的第二个 IP 地址。

使用断点和调试跟踪,我已经验证每次都将正确的值写入 HOSTS 文件。当我尝试从浏览器或其他程序访问 example.com 时,它确实会遵循 HOSTS 文件并转到第二个 IP 地址。

使用 NETMON,我已经验证请求是否直接发送到显示的 IP 地址;没有 HTTP 代理。

由于其他所有内容都遵循更改后的 HOSTS 文件,因此我强烈怀疑 System.Net 基础架构已缓存 example.com 的 DNS 主机 IP 关联。但是,我找不到任何关于此缓存的参考,并且不知道如何刷新或关闭它。

我欢迎有关处理缓存的说明、有关可能导致这些症状的其他原因的建议,或其他建议的可能有用的诊断步骤。

c# .net dns system.net hosts-file
5个回答
50
投票

我终于从 MSDN 中找到了修复此问题的晦涩命令:

ServicePointManager.DnsRefreshTimeout = 0;

当我解开之前尝试过的所有奇怪的事情时,我发现了除了上述设置之外我还需要的另一种设置;在请求对象上,关闭 keep-alive:

request.KeepAlive = false;

15
投票

确实是一个迟到的答案,但我发现这个解决方案比已接受的答案效果更好。在我的场景中,我正在测试 SQL 连接,并且无法应用现有答案,因为我没有

request.KeepAlive
要设置。

Brian Mancini(“derp turkey”)的

此页面详细介绍了他清除 DNS 缓存的冒险经历。完全支持他,我只是在这里添加他的解决方案:

public class DnsUtils  
{        
    [DllImport("dnsapi.dll", EntryPoint="DnsFlushResolverCache")]
    static extern UInt32 DnsFlushResolverCache();

    [DllImport("dnsapi.dll", EntryPoint = "DnsFlushResolverCacheEntry_A")]
    public static extern int DnsFlushResolverCacheEntry(string hostName);

    public static void FlushCache()
    {
        DnsFlushResolverCache();
    }

    public static void FlushCache(string hostName)
    {
        DnsFlushResolverCacheEntry(hostName);
    }
}

5
投票

如果您想保持 DnsRefreshTimeout > 0,则可以通过调用以下命令来更新缓存:

System.Net.Dns.GetHostEntry("example.com");

3
投票

您可以使用 System.Diagnostics.Process 启动 ipconfig /flushdns


0
投票

这是截至 2024 年 3 月我在 Google 中搜索“.net corelush dns of api endpoint”时的最佳结果之一。

更新 Route 53 将域指向不同的公共 IP 后。

我有两台服务器在 IIS 中运行相同的 WebAPI 版本。

我让两台服务器在 Windows 上运行“万维网发布服务”。

根据内部的服务,客户端会访问新服务器,有时是旧服务器 IP/域。

我必须停止旧服务器上的“万维网发布服务”,这样它就不会响应请求。之后,.Net core 服务必须尝试获取新的 DNS,然后它将与新 IP/域上的新服务器进行通信。

长话短说,如果您要迁移到其他服务器,请关闭 Windows 中的服务,这样它们就会超时,然后在内部 .Net 似乎会尝试再次获取 DNS 条目,而不是仅仅假设自端点以来一切都很好还在回复。

© www.soinside.com 2019 - 2024. All rights reserved.