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

时间:2012-01-25 08:19:29

标签: c# ubuntu mono httpwebrequest

我有一个通过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%),一切正常。

有什么想法吗?

5 个答案:

答案 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)

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

  1. 我发现的最佳解决方案,当Wifi发生异常时 连接,只是稍微睡一觉重试我的服务器调用 之间。它大部分时间都有效,否则如果是第二次通话 我没有取消请求。
  2. 如果用户的Wifi非常不稳定或者此错误,也会引发此错误 信号很低。如果没有互联网,则会出现同样的错误 连接,即使连接到Wifi也是如此。
  3. 这与我的答案一致:

      

    System.Net.WebException: Error: NameResolutionFailure when Calling WCF Services throwing exception in mono android application

答案 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秒。