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

时间:2014-07-29 11:23:04

标签: c# .net 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'

经验是在异常之后,可以访问URL。在浏览器中,您只需刷新页面,一切都很好。

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

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

4 个答案:

答案 0 :(得分:35)

可能由于本地网络连接问题导致 (但也可能出现DNS错误)。不幸的是,HResult是通用的,但您可以确定捕获HttpRequestException然后检查InnerException的确切问题:如果它是WebException,那么您可以检查WebException.Status属性例如,WebExceptionStatus.NameResolutionFailure应表明DNS解析问题。


可能会发生,你无能为力。

我建议始终将该(网络相关的)代码包含在一个带有try / catch块的循环中(对于其他错误的<也建议here / em>操作)。处理已知的异常,等待一点(比如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);
            }
        }
    }
}

答案 1 :(得分:2)

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

Hosts file is for what?

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

您的服务器IP 您的DNS

示例:

198.168.1.1 maps.google.com

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

这个问题很确定与c#的HttpClient有关。此客户端旨在重用它。因为处理完HttpClient后,sockets并没有直接关闭。这篇博文 (https://www.nimaara.com/beware-of-the-net-httpclient/) 提供了很好的解释。

您必须处理 DNS 查找表已过时的情况。在博客文章中,您还可以找到有关如何执行此操作的信息。

ServicePointManager.FindServicePoint(endpoint).ConnectionLeaseTimeout = (int)TimeSpan.FromMinutes(1).TotalMilliseconds;

ServicePointManager.DnsRefreshTimeout = (int)1.Minutes().TotalMilliseconds;