Système.Net.WebException: le nom distant n'a pas pu être résolu:
je teste un paramètre avec lequel j'ai des problèmes.
j'utilise simplement HttpClient
dans une boucle qui exécute une requête chaque heure.
var httpClient = new HttpClient();
var message = httpClient.GetAsync(url).Result;
Console.WriteLine(message.StatusCode);
une Fois de temps en temps je reçois cette exception:
Système.Net.Http.HttpRequestException: une erreur s'est produite lors de l'envoi demande. --- >Système.Net.WebException: le nom distant ne pouvait pas être résolu: 'xxx'
L'expérience est que juste après le exception, L'URL est accessible. Dans un navigateur vous rafraîchissez simplement la page et tout est bon.
Je n'ai toujours pas reçu de rapports des utilisateurs qui l'expérimentent donc je me demande si c'est juste un problème local ici, mais je pourrais utiliser un peu d'information pour aider à diagnostiquer.
Est-il un moyen de vérifier si Le nom distant n'a pas pu être résolu est causé par un problème DNS ou par un problème de serveur web des exceptions? Puis-je obtenir plus de renseignements HttpCLient
ou dois-je besoin d'outils de diagnostic plus avancés?
3 réponses
probablement causé par un problème de connectivité réseau local (mais aussi une erreur DNS possible).
cela peut arriver, il n'y a pas grand chose que vous puissiez faire.
ce que je suggère de toujours envelopper ce code (relié au réseau) dans une boucle avec un try
/catch
bloc (comme suggéré aussi ici pour les autres faillible opérations). Gérer les exceptions connues, attendre un peu (disons 1000 msec) et essayer de nouveau (pour dire 3 fois). Seulement si tout a échoué moment, alors vous pouvez quitter/signaler une erreur à vos utilisateurs. Exemple très brut comme ceci:
private const int NumberOfRetries = 3;
private const int DelayOnRetry = 1000;
public static HttpResponseMessage GetFromUrl(string url) {
for (int i=1; i <= NumberOfRetries; ++i) {
try {
// Also consider to make this method async and await this.
// Note that in "real code" client MUST be disposed
return new HttpClient().GetAsync(url).Result;
}
catch (Exception e) {
// DO BETTER THAN THIS! Catch what you want to handle,
// not all exceptions worth a retry. Documentation and many
// tests will help you to narrow a limited subset of
// exceptions and error codes.
// Last one, (re)throw exception and exit
if (i == NumberOfRetries)
throw;
// Many network related errors will recover "automatically"
// after some time, exact delay is pretty arbitrary and
// should be determined with some tests. 1 second is pretty
// "good" for local I/O operations but network issues may
// need longer delays.
Thread.Sleep(DelayOnRetry);
}
}
}
A plus moderne et une meilleure mise en œuvre de la version:
public static async Task<HttpResponseMessage> GetFromUrlAsync(string url) {
using (var client = new HttpClient()) {
for (int i=1; i <= NumberOfRetries; ++i) {
try {
return await client.GetAsync(url);
}
catch (Exception e) when (i < NumberOfRetries) {
await Task.Delay(DelayOnRetry);
}
}
}
}
Ouvrir hosts Fichier localisé à: **C:\windows\system32\drivers\etc**.
le fichier Hosts est pour quoi?
ajouter ce qui suit à la fin de ce fichier :
YourServerIP YourDNS
Exemple:
198.168.1.1maps.google.com
j'ai eu un problème similaire en essayant d'accéder à un service (ancien service ASMX). L'appel fonctionnerait lors de l'accès via une IP mais lors d'un appel avec un alias je recevrais le nom distant ne pourrait pas être résolu.
Ajout de la config et il a résolu le problème:
<system.net>
<defaultProxy enabled="true">
</defaultProxy>
</system.net>