【问题标题】:HttpWebRequest NameResolutionFailure exception in .NET (with Mono on Ubuntu).NET 中的 HttpWebRequest NameResolutionFailure 异常(在 Ubuntu 上使用 Mono)
【发布时间】:2012-02-18 10:54:09
【问题描述】:

我有一个通过 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

服务器还是abel解析DNS,例如

 wget http://www.google.com

将在没有任何问题的情况下返回文件,ping 和其他解析 DNS 的命令也将如此。

但是,我的程序将继续抛出该异常,直到我重新启动它。重新启动应用程序后,它将重新开始正常工作。

我检查了系统上的打开文件计数(400 ish)、内存使用量(327mb of 4gb)、CPU 使用率(2-3%),一切正常。

有什么想法吗?

【问题讨论】:

    标签: c# ubuntu mono httpwebrequest


    【解决方案1】:

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

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

    【讨论】:

    • 您的意思是使用Dns.GetHostEntry(domainName); 或其他方式事先查找IP?我认为如果这确实是 DNS 问题,或者您怀疑它是 Mono / .NET 中的错误,也会导致同样的问题?
    • 是的,通过编程或硬代码。这样可以确保 HttpWebRequest 不会在您每次发出请求时解析 dns。
    • 嗯,好吧,这不是理想的解决方案,因为它仍然存在问题,但我想我可以每隔一小时左右拨打GetHostEntry 以检查 DNS 中的更新并避免硬代码.我真的很想找到问题,因为这只会影响我的一些服务器,而不是全部(我有 50 个)
    • 有人找到解决方案了吗?我也面临同样的问题,这个主机和 IP 解决方法对我不起作用。
    【解决方案2】:

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

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

    这符合我的回答:

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

    【讨论】:

    • 将 wifi 从我糟糕的工作互联网更改为绑定我的 LTE 使这个错误消失了。
    • 与您的问题不同,但提到 WiFi 让我意识到我的问题是什么。我的应用已连接到我们网络的本地 API,当我断开 WiFi 时,它再也找不到 API。
    • 我也尝试过轻微睡眠重试,但并没有解决问题
    【解决方案3】:

    好吧,我使用 HttpClient - 但它可能是一个类似的问题。我在 Android 设备上遇到了同样的问题(它在 Windows Phone 上工作)......但是在我将主机添加到标题之后它工作了!

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

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

    【讨论】:

    • 你们有可重现的样品吗?
    • 没有。当主机设置一次后,设置器就可以被删除......我认为该设备包含自己的“DNS记录”以供将来参考。在我添加该行之前它不起作用,但之后它起作用了。当我再次尝试删除该线路时,它起作用了......我目前没有其他设备可以重现它。注意:我使用了设备之前未访问过的新创建域 - 它是一种完全不同类型的解决方案 (Xamarin.Android)。
    【解决方案4】:

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

    来解决问题

    米尔科

    【讨论】:

      【解决方案5】:

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

      System.Net.ServicePointManager.DnsRefreshTimeout = 0;
      

      默认的 DnsRefreshTimeout 值为 120 秒。

      【讨论】:

      • 不确定,我只使用了 HttpClient。
      • 你设置request.KeepAlive = false;了吗?
      猜你喜欢
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多