c# .net system.net.webexception

c# - System.Net.WebException: el nombre remoto no se pudo resolver:



(3)

Estoy probando un punto final con el que estoy experimentando algunos problemas.

Simplemente estoy usando HttpClient en un bucle que realiza una solicitud cada hora.

var httpClient = new HttpClient(); var message = httpClient.GetAsync(url).Result; Console.WriteLine(message.StatusCode);

De vez en cuando me sale esta excepción:

System.Net.Http.HttpRequestException: Se produjo un error al enviar la solicitud. ---> System.Net.WebException: el nombre remoto no se pudo resolver: ''xxx''

La experiencia es que justo después de la excepción, se puede acceder a la URL. En un navegador simplemente actualiza la página y todo está bien.

Todavía no tengo ningún informe de los usuarios que lo experimentan, por lo que me pregunto si es solo un problema local, pero podría usar un poco de información para ayudar a diagnosticar.

¿Hay alguna forma de verificar si el nombre remoto no se pudo resolver se debe a un problema de DNS o un problema del servidor web a partir de las excepciones? ¿Puedo obtener más información de HttpCLient o necesito herramientas de diagnóstico más avanzadas?


Abra el archivo de hosts ubicado en: ** C: / windows / system32 / drivers / etc **.

¿El archivo de hosts es para qué?

Agregue lo siguiente al final de este archivo:

YourServerIP YourDNS

Ejemplo:

198.168.1.1 maps.google.com


Tuve un problema similar al intentar acceder a un servicio (antiguo servicio ASMX). La llamada funcionaría cuando se accediera a través de una IP; sin embargo, al llamar con un alias obtendría un nombre remoto que no se pudo resolver.

Agregó lo siguiente a la configuración y resolvió el problema:

<system.net> <defaultProxy enabled="true"> </defaultProxy> </system.net>


Probablemente es causado por un problema de conectividad de red local (pero también es posible un error de DNS).

Puede suceder, no hay mucho que puedas hacer.

Lo que sugeriría siempre envolver ese código (relacionado con la red) en un bucle con un bloque try / catch (como también se sugiere here para otras operaciones falibles ). Maneje las excepciones conocidas, espere un poco (digamos 1000 ms) y vuelva a intentarlo (por ejemplo, 3 veces). Solo si falla todo el tiempo, puede salir / reportar un error a sus usuarios. Ejemplo muy crudo como este:

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

Una versión más moderna y mejor implementada:

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