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

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

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

私は単に、HttpClient1 時間ごとにリクエストを実行するループで使用しています。

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、それともより高度な診断ツールが必要ですか?

ベストアンサー1

そのおそらくローカル ネットワーク接続の問題が原因です (DNS エラーの可能性もあります)。残念ながら、これは一般的な問題ですが、キャッチして検査することでHResult正確な問題を特定できます。問題が である場合は、たとえば、プロパティをチェックしてDNS 解決の問題を示すことができます。HttpRequestExceptionInnerExceptionWebExceptionWebException.StatusWebExceptionStatus.NameResolutionFailure


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

try私が提案したいのは、その(ネットワーク関連の)コードを常に/ブロックでループで囲むことですcatchここ他のために誤りやすい操作)。既知の例外を処理し、少し待って (たとえば 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);
            }
        }
    }
}

おすすめ記事