System.Net.WebException:无法解析远程名称:

我正在测试一个端点,我遇到了一些问题。

我只是在一个循环中使用HttpClient ,每小时执行一次请求。

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

有一段时间我得到这个例外:

System.Net.Http.HttpRequestException:发送请求时发生错误。 —> System.Net.WebException:无法解析远程名称:’xxx’

经验是在exception之后,可以访问URL。 在浏览器中,您只需刷新页面即可。

我仍然没有得到用户体验它的任何报告,所以我想知道这是否只是一个本地问题,但可以使用一些信息来帮助诊断。

有没有办法检查无法解析远程名称是由DNS问题还是由例外的Web服务器问题引起的? 我可以从HttpCLient获取更多信息,还是需要更高级的诊断工具?

可能是由本地网络连接问题引起的(但也可能是DNS错误)。

它可能会发生,你可以做的并不多。

我建议总是将这个(网络相关的)代码用try / catch块包装在一个循环中(这也是其他易操作的建议)。 处理已知的exception,等待一点(比如1000毫秒)并再试一次(比如说3次)。 只有在一直失败的情况下,您才能退出/向用户报告错误。 像这样非常原始的例子:

 private const int NumberOfRetries = 3; private const int DelayOnRetry = 1000; public static HttpResponseMessage GetFromUrl(string url) { for (int i=1; i <= NumberOfRetries; ++i) { try { // Also consider to make this method async and await this. // Note that in "real code" client MUST be disposed return new HttpClient().GetAsync(url).Result; } catch (Exception e) { // DO BETTER THAN THIS! Catch what you want to handle, // not all exceptions worth a retry. Documentation and many // tests will help you to narrow a limited subset of // exceptions and error codes. // Last one, (re)throw exception and exit if (i == NumberOfRetries) throw; // Many network related errors will recover "automatically" // after some time, exact delay is pretty arbitrary and // should be determined with some tests. 1 second is pretty // "good" for local I/O operations but network issues may // need longer delays. Thread.Sleep(DelayOnRetry); } } } 

现代 ,更好的实施版本:

 public static async Task 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); } } } } 

打开位于以下位置的hosts文件:** C:\ windows \ system32 \ drivers \ etc **。

主机文件是为了什么?

在此文件的末尾添加以下内容:

YourServerIP YourDNS

例:

198.168.1.1 maps.google.com

尝试访问服务(旧的ASMX服务)时,我遇到了类似的问题。 通过IP访问时调用将起作用,但是当使用别名调用时,我将无法解析远程名称。

在配置中添加了以下内容,它解决了问题: