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?
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
.
Je sais que ceci est un ancien post, mais faisait face à la même erreur, alors pensé à partager la solution.
Ceci est en ligne avec mes ans sur:
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)
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
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.