Domanda

Sto provando un endpoint che sto vivendo alcuni problemi con.

Sto semplicemente usando HttpClient in un loop che esegue una richiesta ogni ora.

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

Una volta ogni tempo ricevo questa eccezione:

.

system.net.http.httprequestexception: si è verificato un errore durante l'invio la richiesta.---> System.net.WebException: il nome remoto non potrebbe essere risolto: 'xxx'

L'esperienza è quella subito dopo l'eccezione, è possibile accedere all'URL.In un browser si è semplicemente aggiorna la pagina e tutto è buono.

Non ho ancora alcun rapporto da utenti che gli sperimentalo, quindi mi chiedo se è solo una questione locale qui, ma potrei usare una piccola informazione per aiutare a diagnosticare.

C'è un modo per verificare se il nome remoto non può essere risolto è causato da un problema DNS o da un problema del server Web dalle eccezioni?Posso ottenere maggiori informazioni da HttpCLient o ho bisogno di strumenti diagnostici più avanzati?

È stato utile?

Soluzione

È probabilmente causato da un problema di connettività di rete locale (ma è possibile anche un errore DNS).Sfortunatamente HResult è Generico, tuttavia è possibile determinare il problema esatto di cattura generacolo HttpRequestException e quindi ispezionare InnerException: se è un WebException, è possibile controllare la proprietà WebException.Status, ad esempio WebExceptionStatus.NameResolutionFailure dovrebbe indicare un problema di risoluzione DNS.


.

Può accadere, non c'è molto che puoi fare.

Cosa suggerirei di avvolgere sempre il codice (relativo a rete) in un ciclo con un blocco try / catch (come suggerito anche Qui per altre operazioni fallible ).Gestire le eccezioni conosciute, aspetta un po '(diciamo 1000 msec) e riprova (per dire 3 volte).Solo se non è riuscito tutte le volte, puoi uscire / segnalare un errore ai tuoi utenti.Esempio molto crudo come questo:

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

Altri suggerimenti

Ho avuto un problema simile durante il tentativo di accedere a un servizio (vecchio servizio ASMX).La chiamata funzionerebbe quando si accede all'accesso tramite un IP, tuttavia quando si chiama con un alias avrei ottenuto il nome remoto non può essere risolto.

Aggiunta quanto segue alla configurazione e ha risolto il problema:

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

Apri il file host situato a: ** c: \ windows \ system32 \ driver \ etc **.

Il file host è per cosa?

Aggiungi quanto segue alla fine di questo file:

YourserNeller YourDNS

Esempio:

198.168.1.1 Maps.google.com

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top