Je teste un ordinateur d'extrémité avec lequel je rencontre des problèmes.
J'utilise simplement HttpClient
dans une boucle qui effectue une requête toutes les heures.
var httpClient = new HttpClient();
var message = httpClient.GetAsync(url).Result;
Console.WriteLine(message.StatusCode);
De temps en temps je reçois cette exception:
System.Net.Http.HttpRequestException: une erreur s'est produite lors de l'envoi la demande. ---> System.Net.WebException: le nom distant n'a pas pu être résolu: 'xxx'
L’expérience est qu’après l’exception, l’URL est accessible. Dans un navigateur, vous actualisez simplement la page et tout va bien.
Je n'ai toujours pas eu de rapports d'utilisateurs qui l'ont rencontré, donc je me demande s'il ne s'agit pas ici d'un problème local, mais je pourrais utiliser un peu d'informations pour faciliter le diagnostic.
Existe-t-il un moyen de vérifier si Le nom distant ne peut pas être résolu est provoqué par un problème de DNS ou par un problème de serveur Web des exceptions? Puis-je obtenir plus d'informations sur HttpCLient
ou ai-je besoin d'outils de diagnostic plus avancés?
C'est probablement causé par un problème de connectivité réseau local (mais une erreur DNS est également possible). Malheureusement, HResult
est générique. Toutefois, vous pouvez déterminer le problème exact. HttpRequestException
, puis inspecter InnerException
: si c'est un WebException
, vous pouvez vérifier la propriété WebException.Status
. Par exemple, WebExceptionStatus.NameResolutionFailure
doit indiquer un problème de résolution DNS.
Cela peut arriver, vous ne pouvez pas faire grand chose.
Ce que je suggérerais de toujours envelopper ce code (lié au réseau) dans une boucle avec un bloc try
catch
(comme suggéré également ici pour les autres opérations _/faillible). Traitez les exceptions connues, attendez un peu (disons 1000 ms) et réessayez (par exemple 3 fois). Ce n'est qu'en cas d'échec constant que vous pouvez quitter/signaler une erreur à vos utilisateurs. Exemple très brut comme celui-ci:
private const int NumberOfRetries = 3;
private const int DelayOnRetry = 1000;
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);
}
}
}
}
Ouvrez le fichier hôtes _ situé à l'emplacement suivant: ** C:\windows\system32\drivers\etc **.
Le fichier hôtes est pour quoi?
Ajoutez ce qui suit à la fin de ce fichier:
YourServerIPYourDNS
Exemple:
198.168.1.1maps.google.com
J'ai eu un problème similaire lors de la tentative d'accès à un service (ancien service ASMX). L'appel fonctionnerait lors d'un accès via une adresse IP. Cependant, lorsque vous appelez avec un alias, le nom distant ne peut être résolu.
Ajout de ce qui suit à la configuration et cela a résolu le problème:
<system.net>
<defaultProxy enabled="true">
</defaultProxy>
</system.net>