Pregunta

Estoy probando un extremo que yo estoy experimentando algunos problemas con el.

Simplemente estoy usando HttpClient en un bucle que realiza una petición a cada hora.

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

De vez en cuando me estoy poniendo de esta excepción:

Sistema.Net.Http.HttpRequestException:Se ha producido un error al enviar la solicitud.---> Sistema.Net.WebException:El nombre remoto podría no se resuelve:'xxx'

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

Aún no tengo todos los informes de los usuarios que lo experimenta así que me pregunto si es sólo un problema local aquí, pero podría utilizar un poco de información para ayudar a diagnosticar.

Hay una forma de comprobar si El nombre remoto no puede ser resuelto es causada por un problema de DNS o el servidor web cuestión de las excepciones?Puedo obtener más información de HttpCLient o necesito más avanzadas herramientas de diagnóstico?

¿Fue útil?

Solución

Es probablemente causado por un problema de conectividad de red (pero también un error de DNS es posible).Por desgracia HResult es genérico, sin embargo, usted puede determinar el problema exacto de la captura de HttpRequestException y, a continuación, la inspección de InnerException:si es un WebException a continuación, puede ver la WebException.Status la propiedad, por ejemplo WebExceptionStatus.NameResolutionFailure debe indicar una resolución de DNS problema.


Puede suceder, no hay mucho que usted puede hacer.

Lo que yo sugiero siempre envoltura (red) de código en un bucle con un try/catch bloque (como también se sugirió aquí para otros falible las operaciones).Manejar excepciones conocidas, esperar un poco (digamos 1000 mseg) e inténtelo de nuevo (por decir 3 veces).Sólo si la falta de todos los tiempos entonces usted puede dejar de fumar/informar de un error a los usuarios.Muy cruda ejemplo como este:

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

Otros consejos

Tuve un problema similar al intentar acceder a un servicio (Old Asmx Service).La llamada funcionaría al acceder a través de una IP, sin embargo, cuando llame con un alias, obtendría el nombre remoto no se pudo resolver.

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

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

Abra el archivo hosts ubicado en: ** c: \ windows \ system32 \ drivers \ etc **.

¿El archivo hosts es para qué?

Agregue el siguiente al final de este archivo:

yourserverip yourdns

Ejemplo:

198.168.1.1 maps.google.com

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top