web-dev-qa-db-ja.com

System.Net.WebException:リモート名を解決できませんでした:

いくつかの問題が発生しているエンドポイントをテストしています。

1時間ごとに要求を実行するループでHttpClientを使用しています。

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

たまにこの例外が発生します:

System.Net.Http.HttpRequestException:リクエストの送信中にエラーが発生しました。 ---> System.Net.WebException:リモート名を解決できませんでした: 'xxx'

例外として、例外の直後にURLにアクセスできます。ブラウザーでは、単にページを更新するだけで十分です。

私はまだそれを経験しているユーザーからのレポートを持っていないので、それはここでのローカルの問題だけではないかと思っていますが、診断に役立つ小さな情報を使用できます。

リモート名を解決できませんでしたがDNSの問題または例外によるWebサーバーの問題に起因するかどうかを確認する方法はありますか? HttpCLientから詳細情報を取得できますか、またはより高度な診断ツールが必要ですか?

28

これはおそらくローカルネットワーク接続の問題が原因です(ただし、DNSエラーも可能です)。残念ながらHResultは汎用ですが、HttpRequestExceptionをキャッチしてからInnerExceptionを調べる正確な問題を判別できます。それがWebExceptionである場合は、WebException.Statusプロパティを確認できます、たとえば、WebExceptionStatus.NameResolutionFailureはDNS解決の問題を示す必要があります。


それは起こるかもしれません、あなたができることはあまりありません。

(ネットワーク関連の)コードをtry/catchブロックでループに常にラップすることをお勧めします( here for otherfallible操作)。既知の例外を処理し、少し待って(たとえば1000ミリ秒)、再試行します(たとえば3回)。常に失敗した場合にのみ、ユーザーにエラーを終了/報告できます。このような非常に生の例:

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);
            }
        }
    }
}
37
Adriano Repetti

サービス(古いASMXサービス)にアクセスしようとしたときに、同様の問題が発生しました。 IP経由でアクセスする場合、呼び出しは機能しますが、エイリアスを使用して呼び出すと、リモート名を解決できませんでした。

設定に次を追加し、問題を解決しました。

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

** C:\ windows\system32\drivers\etc **にあるhostsファイルを開きます。

ホストファイルは何のためですか?

このファイルの最後に次を追加します。

YourServerIPYourDNS

例:

198.168.1.1maps.google.com

2
mubsher