在C# + Mono中重置DNS缓存

3

我正在使用C#MonoUbuntu上开发软件,并且使用了像WebRequestDns这样的网络类。在开发阶段,我使用我的代码连接到本地web服务器192.168.1.101,不久之后,我将其移动到102.168.1.20,并使用本地DNS服务器为提到的IP地址提供可读名称(以模拟实际情况)。但是现在,无论我做什么,都无法在C#代码中连接到新服务器!以下是它们的状态:

  • $ ping myurl.local => 192.168.1.20

  • $ nslookup myurl.local => 192.168.1.20

  • 来自我的代码日志:Dns.GetHostAddresses("myurl.local")[0].ToString() => 192.168.1.101

我觉得Mono已经从以前缓存了DNS解析结果,并且它不会放手。因此,我在互联网上搜索了它,并找到了这个问题。它和我的问题一样,但是在Windows和.Net中,还有一个解决方案。不幸的是,它的解决方案不适用于我的情况,因为ServicePointManager.DnsRefreshTimeout在Mono中没有实现!最糟糕的部分是,即使我重新启动软件和/或硬件,缓存也是持久的,因此我无法继续开发!

所以,我想知道是否有一种方法可以重置Mono的缓存,除了使用DnsRefreshTimeout?即使是手动解决方案(例如,在shell中可以执行的操作!例如删除文件!?)。

我正在使用Ubuntu 12.04Mono 3.2.3


你解决了这个问题吗?我在使用Mono时似乎遇到了类似的问题... - David Duffett
@DavidDuffett,你看,我遇到这个问题已经有一段时间了。当时我无法解决它,只能使用一个新的DNS! - Mehran
2个回答

1

0
作为一种解决方法,手动请求DNS并直接连接到IP,例如:
// Get hostname IPs manually (this may fail)
IPAddress[] ips = Dns.GetHostEntry('api.example.com').AddressList;

// New web request, initialize with endpoint URL
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + ips[0].ToString() + "/api/");

似乎有一些误解,问题在于Mono将域名解析为旧的IP地址。某些域名的IP地址似乎被缓存在某个地方,即使该域名现在指向其他IP,但Mono仍将其解析为相同的旧IP地址。因此,您的解决方案将面临与词干相同的命运,即错误的IP地址。 - Mehran
你确定吗?Mono会缓存旧的IP地址,但仅在通过HttpWebRequest解析时才会这样做。而不是通过Dns.GetHostEntry。该DNS请求不会被缓存。 - Elad Nava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接