it-swarm.com.de

HttpWebRequest NameResolutionFailure-Ausnahme in .NET (mit Mono unter Ubuntu)

Ich habe ein .NET-Programm, das unter Ubuntu über Mono 2.10 läuft

Das Programm lädt jede Minute eine Webseite über eine HttpWebRequest herunter, was die meiste Zeit gut funktioniert:

        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();
            }
        }

Das Problem ist, dass ich nach ein paar Tagen Ausnahmen bekomme:

        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

Der Server kann zum Beispiel immer noch DNS auflösen

 wget http://www.google.com

Gibt die Datei ohne Probleme zurück, ebenso wie Ping und andere Befehle, die DNS auflösen.

Mein Programm wird diese Ausnahme jedoch weiterhin auslösen, bis ich es neu starte. Nach dem Neustart der Anwendung funktioniert sie wieder ordnungsgemäß.

Ich habe die Anzahl offener Dateien auf dem System (400 ish), die Speicherauslastung (327 MB von 4 GB), die CPU-Auslastung (2-3%) überprüft und alle sind in Ordnung.

Irgendwelche Ideen?

15
antfx

Sie können das Problem beheben, indem Sie den Hostnamen in "ip" übersetzen und den Hostnamen der Sammlung "Headers" oder der Eigenschaft "Host" hinzufügen.

Wenn Ihre URL http://example.com/uri lautet. Lösen Sie den Host selbst. Angenommen, sein 1.2.3.4. Es wird http://1.2.3.4/uri sein. Fügen Sie Ihrer Anfrage nun den Header Host: example.com hinzu. Ich denke, dass es getan werden kann, indem man HttpWebRequest.Host Eigenschaft einstellt.

9
Shiplu Mokaddim

Ich weiß, dass dies ein alter Beitrag ist, aber derselbe Fehler aufgetreten ist. Ich dachte, ich teile die Lösung.

  1. Die beste Lösung, die ich gefunden habe, wenn diese Ausnahme auftritt, während das Wifi verbunden ist, besteht darin, meinen Serveranruf mit einer leichten Unterbrechung zu wiederholen. Es funktioniert die meiste Zeit, ansonsten, wenn der zweite Anruf fehlschlägt, storniere ich die Anfrage.
  2. Dieser Fehler kann auch auftreten, wenn das WLAN des Benutzers sehr instabil oder das Signal sehr schwach ist. Der gleiche Fehler tritt auf, wenn überhaupt keine Internetverbindung besteht, auch wenn eine Verbindung zu Wifi besteht.

Dies steht im Einklang mit meiner Ans on:

System.Net.WebException: Fehler: NameResolutionFailure beim Aufrufen von WCF-Diensten, die eine Ausnahme in einer Mono-Android-Anwendung auslösen

3
NG.

Naja ich benutze den HttpClient - aber es könnte ein ähnliches Problem sein. Ich hatte das gleiche Problem auf einem Android-Gerät (es funktionierte auf einem Windows Phone) ... Aber nachdem ich den Host zum Header hinzugefügt hatte, funktionierte es!

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

Sie können weiterhin den Namen in der URL verwenden (Sie müssen nicht die IP-Adresse verwenden)

3
Kim Rasmussen

Ich hatte das gleiche Problem in meiner Mono-Anwendung auf Raspbian. Ich habe verschiedene in diesem und anderen Threads beschriebene Lösungen ausprobiert, aber keine hat funktioniert. Irgendwann konnte ich das Problem beheben, indem ich die Nameserver in /etc/resolv.conf auf google https://developers.google.com/speed/public-dns/ änderte.

Mirko

0
mirko gatto

Ich habe diese Fehlermeldung erhalten, als ich die mobile App ohne Internetverbindung gestartet habe (Android oder iOS spielt keine Rolle). Nachdem die Verbindung wiederhergestellt wurde, gibt jede Anforderung "NameResolutionFailure exception" zurück. Ich musste 120 Sekunden warten, bis die http-Anfrage wieder funktionierte. Durch Festlegen der folgenden Codezeile an einer beliebigen Stelle im App-Start wurde der Fehler behoben.

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

Der Standardwert für DnsRefreshTimeout beträgt 120 Sekunden.

0
gts