我有一个通过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();
}
}
问题是几天之后我开始抛出异常:
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
服务器仍然可以解析DNS,例如
wget http://www.google.com
将在没有任何问题的情况下返回文件,ping和其他解析DNS的命令。
然而,我的程序将继续抛出该异常,直到我重新启动它。重新启动应用程序后,它将再次开始工作。
我已检查系统上的打开文件数(400 ish),内存使用量(327mb of 4gb),CPU使用率(2-3%),一切正常。
有什么想法吗?
答案 0 :(得分:9)
您可以通过将主机名转换为IP并将主机名添加到Headers
集合或Host
属性来解决此问题。
如果您的网址为http://example.com/uri
。自己解决主机问题。假设它是1.2.3.4
。它将是http://1.2.3.4/uri
。现在为您的请求添加Host: example.com
标头。我认为可以通过设置HttpWebRequest.Host
属性来完成。
答案 1 :(得分:3)
我知道这是一个旧帖子,但面临同样的错误,所以想分享解决方案。
这与我的答案一致:
答案 2 :(得分:3)
我使用HttpClient - 但它可能是一个类似的问题。我在Android设备上遇到了同样的问题(它在Windows Phone上工作)...但是在我将主机添加到标题后它才起作用了!
client.DefaultRequestHeaders.Host =“mydomain.com”;
您仍然可以在网址中使用该名称(您不必使用IP地址)
答案 3 :(得分:0)
我在raspbian的单声道应用程序中遇到了同样的问题。我尝试了在这个和其他线程中描述的不同解决方案但没有工作。最后,我能够通过将/etc/resolv.conf中的名称服务器更改为google https://developers.google.com/speed/public-dns/
来解决问题。的Mirko
答案 4 :(得分:0)
当我在没有互联网连接的情况下启动移动应用程序(Android或iOS并不重要)时,我收到此错误。恢复连接后,每个请求都返回&#34; NameResolutionFailure exception&#34;。我不得不等待120秒才能让http请求再次运行。在应用启动的任何地方设置以下代码行,错误终于消失了。
System.Net.ServicePointManager.DnsRefreshTimeout = 0;
默认的DnsRefreshTimeout值为120秒。