Frage

Ich teste einen Endpunkt, mit dem ich einige Probleme habe.

Ich benutze es einfach HttpClient in einer Schleife, die jede Stunde eine Anfrage ausführt.

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

Hin und wieder erhalte ich diese Ausnahme:

System.Net.Http.HttpRequestException:Ein Fehler beim Senden der Anforderung.---> System.Net.WebException:Die Remotename konnte nicht aufgelöst werden:'xxx'

Die Erfahrung ist, dass direkt nach der Ausnahme auf die URL zugegriffen werden kann.In einem Browser aktualisieren Sie einfach die Seite und alles ist gut.

Ich habe immer noch keine Berichte von Benutzern erhalten, bei denen das Problem aufgetreten ist, daher frage ich mich, ob es sich hier nur um ein lokales Problem handelt, aber ein paar Informationen zur Diagnose könnten nützlich sein.

Gibt es eine Möglichkeit zu überprüfen, ob Die Remotename konnte nicht aufgelöst werden Wird durch ein DNS-Problem oder durch ein Webserverproblem aus den Ausnahmen verursacht?Kann ich weitere Informationen erhalten? HttpCLient Oder benötige ich erweiterte Diagnosetools?

War es hilfreich?

Lösung

Es ist wahrscheinlich verursacht durch ein lokales Netzwerkverbindungsproblem (aber auch ein DNS-Fehler ist möglich).Bedauerlicherweise HResult ist generisch, Sie können jedoch das genaue Problem bestimmen, das auftritt HttpRequestException und dann inspizieren InnerException:wenn es ein ist WebException dann kannst du das überprüfen WebException.Status Eigentum, zum Beispiel WebExceptionStatus.NameResolutionFailure sollte auf ein DNS-Auflösungsproblem hinweisen.


Es kann passieren, dass Sie nicht viel tun können.

Was ich vorschlagen würde, ist, diesen (netzwerkbezogenen) Code immer in eine Schleife mit einem zu packen try/catch blockieren (wie auch vorgeschlagen Hier für andere fehlbar Operationen).Behandeln Sie bekannte Ausnahmen, warten Sie ein wenig (z. B. 1000 ms) und versuchen Sie es erneut (z. B. dreimal).Nur wenn jedes Mal ein Fehler aufgetreten ist, können Sie den Vorgang beenden bzw. Ihren Benutzern einen Fehler melden.Sehr grobes Beispiel wie dieses:

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

Andere Tipps

Ich hatte ein ähnliches Problem, als ich versuchte, auf einen Dienst zuzugreifen (alter ASMX-Dienst).Der Anruf würde funktionieren, wenn der Zugriff über eine IP erfolgt. Wenn ich jedoch mit einem Alias ​​anrufe, erhalte ich die Meldung, dass der Remote-Name nicht aufgelöst werden konnte.

Der Konfiguration wurde Folgendes hinzugefügt und das Problem wurde behoben:

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

Öffne das Gastgeber Datei befindet sich unter:**C:\windows\system32\drivers\etc**.

Wozu dient die Hosts-Datei?

Fügen Sie am Ende dieser Datei Folgendes hinzu:

YourServerIP YourDNS

Beispiel:

198.168.1.1 maps.google.com

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top