web-dev-qa-db-fra.com

HttpWebRequest NameResolutionFailure exception dans .NET (avec Mono sur Ubuntu)

J'ai un programme .NET fonctionnant sous Ubuntu via Mono 2.10

Le programme télécharge une page Web via une requête HttpWebRequest toutes les minutes environ, ce qui fonctionne bien la plupart du temps:

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

Le problème est qu'après quelques jours, des exceptions sont lancées:

        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

Le serveur est toujours capable de résoudre le DNS, par exemple

 wget http://www.google.com

Renverra le fichier sans problème, de même que le ping et les autres commandes permettant de résoudre le problème DNS.

Mon programme continuera cependant à lancer cette exception jusqu'à ce que je la redémarre. Après avoir redémarré l’application, elle fonctionnera à nouveau comme il se doit.

J'ai vérifié le nombre de fichiers ouverts sur le système (400 USD), l'utilisation de la mémoire (327 Mo de 4 Go), l'utilisation du processeur (2-3%) et tout va bien.

Des idées?

15
antfx

Vous pouvez le résoudre en traduisant le nom d'hôte en ip et en ajoutant le nom d'hôte à la collection Headers ou à la propriété Host.

Si votre URL est http://example.com/uri. Résoudre l'hôte vous-même. Supposons que son 1.2.3.4. Ce sera http://1.2.3.4/uri. Ajoutez maintenant l'en-tête Host: example.com à votre demande. Je pense que cela peut être fait en définissant la propriété HttpWebRequest.Host.

9
Shiplu Mokaddim

Je sais que ceci est un ancien post, mais faisait face à la même erreur, alors pensé à partager la solution.

  1. La meilleure solution que j'ai trouvée, lorsque cette exception se produit alors que le réseau Wi-Fi est connecté, consiste simplement à réessayer mon appel sur le serveur avec un léger sommeil entre les deux. Cela fonctionne la plupart du temps, sinon si le deuxième appel échoue, j'annule la demande.
  2. Cette erreur peut également survenir si le Wifi de l'utilisateur est très instable ou si le signal est très faible. La même erreur se produit s'il n'y a aucune connexion Internet, même si elle est connectée au Wifi.

Ceci est en ligne avec mes ans sur:

System.Net.WebException: Erreur: NameResolutionFailure lors de l'appel des services WCF en levant une exception dans une application Android mono

3
NG.

Eh bien, j'utilise le HttpClient - mais il pourrait s'agir d'un problème similaire. J'ai eu le même problème sur un appareil Android (cela fonctionnait sur un Windows Phone) ... Mais après, j'ai ajouté l'hôte à l'en-tête, cela a fonctionné!

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

Vous pouvez toujours utiliser le nom dans l'URL (vous n'êtes pas obligé d'utiliser l'adresse IP)

3
Kim Rasmussen

Je rencontrais le même problème dans mon application mono sur Raspbian. J'ai essayé différentes solutions décrites dans cette discussion et dans d'autres, mais aucune n'a fonctionné. Finalement, j'ai pu résoudre le problème en remplaçant les serveurs de noms de /etc/resolv.conf par ceux de Google https://developers.google.com/speed/public-dns/

Mirko

0
mirko gatto

Je commençais à avoir cette erreur lorsque j'ai démarré l'application mobile (Android ou iOS, ce n'est pas grave) sans connexion Internet. Après la restauration de la connexion, chaque demande renvoie "l'exception NameResolutionFailure". J'ai dû attendre 120 secondes pour que la requête http fonctionne à nouveau. En définissant la ligne de code suivante n'importe où dans le démarrage de l'application, l'erreur a finalement disparu.

System.Net.ServicePointManager.DnsRefreshTimeout = 0;

La valeur par défaut de DnsRefreshTimeout est 120 secondes.

0
gts