System.Net.WebException:Die Remotename konnte nicht aufgelöst werden:
-
21-12-2019 - |
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?
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**.
Fügen Sie am Ende dieser Datei Folgendes hinzu:
YourServerIP YourDNS
Beispiel:
198.168.1.1 maps.google.com