HttpWebRequest NameResolutionFailure在.NET中的exception(在Ubuntu上使用Mono)

我有一个通过Mono 2.10在Ubuntu上运行的.NET程序

程序每分钟通过一个HttpWebRequest下载一个网页,大部分时间工作正常。

String result; WebResponse objResponse; WebRequest objRequest = System.Net.HttpWebRequest.Create(url); using (objResponse = objRequest.GetResponse()) { using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) { result = sr.ReadToEnd(); // Close and clean up the StreamReader sr.Close(); } } 

问题是,几天后我开始抛出exception:

  DateTime: 01/25/2012 08:15:41 Type: System.Net.WebException Error: Error: NameResolutionFailure Stack: at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0 at socks_server.Program.readHtmlPage (System.String url) [0x00000] in <filename unknown>:0 at socks_server.Program.getAccessKeysProc () [0x00000] in <filename unknown>:0 

例如,服务器仍然可以parsingDNS

  wget http://www.google.com 

将会返回没有任何问题的文件,因为会ping和parsingDNS的其他命令。

然而,我的程序将继续抛出exception,直到我重新启动它。 重新启动应用程序后,它会重新开始工作,因为它应该。

我已经检查了在系统(400 ish),内存使用情况(327mb的4GB),CPU使用率(2-3%)的开放文件计数,一切正常。

有任何想法吗?

您可以通过将主机名转换为ip并将主机名添加到Headers集合或Host属性来解决此问题。

如果您的网址是http://example.com/uri 。 自己解决主机。 假设它的1.2.3.4 。 这将是http://1.2.3.4/uri 。 现在将Host: example.com标题添加到您的请求中。 我认为这可以通过设置HttpWebRequest.Host属性来完成。

那么我使用HttpClient – 但它可能是一个类似的问题。 我有一个Android设备上的相同问题(它在Windows Phone上工作)…但是,我把主机添加到它的标题它的工作!

client.DefaultRequestHeaders.Host =“mydomain.com”;

您仍然可以在网址中使用该名称(您不必使用IP地址)

我知道这是一个旧的帖子,但面临同样的错误,所以想分享解决方案。

  1. 我发现最好的解决方案,当Wifi连接出现异常时,只是在稍微休眠的情况下重试我的服务器调用。 它大部分时间工作,否则如果第二个电话失败我取消请求。
  2. 如果用户的Wifi非常不稳定或者信号非常低,这个错误也会增加。 如果没有互联网连接,即使连接到Wifi也会发生同样的错误。

这符合我的回答:

System.Net.WebException:错误:NameResolutionFailure调用WCF服务在单声道Android应用程序中抛出异常

我在使用raspbian的单一应用程序中遇到了同样的问题。 我已经尝试了在这个和其他线程中描述的不同解决方案,但都没有工作 最终,我能够通过将/etc/resolv.conf中的名称服务器更改为Google的https://developers.google.com/speed/public-dns/

米尔科

当我开始移动应用程序(Android或iOS没关系)时,我得到这个错误,没有互联网连接。 恢复连接后,每个请求返回“NameResolutionFailure异常”。 我必须等待120秒才能使http请求再次工作。 在应用程序启动的任何位置设置下面的代码行,错误终于消失了。

 System.Net.ServicePointManager.DnsRefreshTimeout = 0; 

默认的DnsRefreshTimeout值是120秒。