問題が発生しているエンドポイントをテストしています。
私は単に、HttpClient
1 時間ごとにリクエストを実行するループで使用しています。
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 解決の問題を示すことができます。HttpRequestException
InnerException
WebException
WebException.Status
WebExceptionStatus.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);
}
}
}
}