web-dev-qa-db-ja.com

.NETでのHttpWebRequestNameResolutionFailure例外(UbuntuでMonoを使用)

私はMono2.10を介してUbuntuで実行されている.NETプログラムを持っています

プログラムは、HttpWebRequestを介して1分ごとにWebページをダウンロードします。これは、ほとんどの場合正常に機能します。

        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を解決するためにまだabelです

 wget http://www.google.com

DNSを解決するpingやその他のコマンドと同様に、probelmなしでファイルを返します。

ただし、私のプログラムは、再起動するまでその例外をスローし続けます。アプリケーションを再起動すると、正常に動作を再開します。

システムで開いているファイル数(400 ish)、メモリ使用量(327mb of 4gb)、CPU使用率(2〜3%)を確認しましたが、すべて問題ありません。

何か案は?

15
antfx

ホスト名をipに変換し、ホスト名をHeadersコレクションまたはHostプロパティに追加することで解決できます。

URLがhttp://example.com/uriの場合。ホストを自分で解決します。その1.2.3.4を想定します。 http://1.2.3.4/uriになります。次に、リクエストにHost: example.comヘッダーを追加します。 HttpWebRequest.Hostプロパティを設定することで実現できると思います。

9
Shiplu Mokaddim

これは古い投稿ですが、同じエラーに直面していたので、解決策を共有することを考えました。

  1. Wifiの接続中に例外が発生した場合に私が見つけた最善の解決策は、サーバーの呼び出しを少しスリープさせて再試行することです。ほとんどの場合は機能しますが、2回目の呼び出しが失敗した場合は、リクエストをキャンセルします。
  2. このエラーは、ユーザーのWifiが非常に不安定であるか、信号が非常に低い場合にも発生する可能性があります。 Wifiに接続していても、インターネットにまったく接続していない場合も同じエラーが発生します。

これは私の答えと一致しています:

System.Net.WebException:エラー:モノラルで例外をスローするWCFサービスを呼び出すときのNameResolutionFailure Android application

3
NG.

私はHttpClientを使用していますが、同様の問題である可能性があります。 Androidデバイス(Windows Phoneで動作しました)でも同じ問題が発生しました...しかし、ヘッダーにホストを追加した後、動作しました!

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

URLで名前を引き続き使用できます(IPアドレスを使用する必要はありません)

3
Kim Rasmussen

ラズビアンのモノラルアプリケーションでも同じ問題が発生していました。このスレッドや他のスレッドで説明されているさまざまなソリューションを試しましたが、どれも機能しませんでした。最終的に、/ etc/resolv.confのネームサーバーをGoogleのものに変更することで問題を修正することができました https://developers.google.com/speed/public-dns/

ミルコ

0
mirko gatto

インターネットに接続せずにモバイルアプリ(AndroidまたはiOSは関係ありません)を起動したときに、このエラーが発生していました。接続が復元された後、すべての要求は「NameResolutionFailure例外」を返します。 httpリクエストが再び機能するまで120秒待たなければなりませんでした。アプリの起動時に次のコード行を設定すると、エラーはようやくなくなりました。

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

デフォルトのDnsRefreshTimeout値は120秒です。

0
gts