在.NET中出现HttpWebRequest NameResolutionFailure异常(在Ubuntu上使用Mon

本文关键字:Ubuntu Mon NameResolutionFailure NET HttpWebRequest 异常 | 更新日期: 2023-09-27 18:21:32

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

该程序每隔一分钟左右通过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的4gb),CPU使用量(2-3%),所有都还可以

有什么想法吗?

在.NET中出现HttpWebRequest NameResolutionFailure异常(在Ubuntu上使用Mon

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

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

我知道这是一篇旧帖子,但遇到了同样的错误,所以想分享解决方案。

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

这与我在上的回答一致

System.Net.WebException:错误:调用WCF服务时NameResolutionFailure在单安卓应用程序中引发异常

我使用了HttpClient,但这可能是一个类似的问题。我在安卓设备上也遇到了同样的问题(它在Windows Phone上工作)。。。但在我把主机添加到标题后,它起了作用!

client.DefaultRequestHeaders.Host="mydomain.com";

您仍然可以使用url中的名称(不必使用IP地址)

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

Mirko

当我在没有互联网连接的情况下启动移动应用程序(android或iOS,这无关紧要)时,我收到了这个错误。恢复连接后,每个请求都返回"NameResolutionFailure异常"。我不得不等待120秒才能让http请求再次工作。在应用程序启动的任何地方设置以下代码行,错误终于消失了。

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

默认的DnsRefreshTimeout值为120秒。