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

Posted

技术标签:

【中文标题】System.Net.WebException:无法解析远程名称:【英文标题】:System.Net.WebException: The remote name could not be resolved: 【发布时间】:2014-07-29 11:23:03 【问题描述】:

我正在测试一个遇到问题的端点。

我只是在一个每小时执行一个请求的循环中使用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 获得更多信息还是需要更高级的诊断工具?

【问题讨论】:

如果你愿意,你可以在这里分享实际的 URL,我们可以看看它是否对每个人都失败了,但这似乎是某些服务的本地失败。 您是否厌倦了在连接属性中切换您的 DNS 服务器? (例如 8.8.8.8 上的 Google DNS) 不。什么都没试过。感觉就像是当站点空闲了一段时间,然后第一个请求将其唤醒。看起来很奇怪 [Fiddler] DNS 查找“url”失败。 System.Net.Sockets.SocketException 这通常是主机名解析期间的临时错误,意味着本地服务器没有收到来自权威服务器的响应 尝试ipconfig /flushdns 并临时更改 DNS 服务器 【参考方案1】:

可能是由本地网络连接问题引起的(但也可能是 DNS 错误)。不幸的是HResult 是通用的,但是您可以确定捕获HttpRequestException 然后检查InnerException 的确切问题:如果它是WebException,那么您可以检查WebException.Status 属性,例如WebExceptionStatus.NameResolutionFailure 应该指示DNS分辨率问题。


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

我建议始终使用try/catch 块将(与网络相关的)代码包装在一个循环中(对于其他错误 操作也建议here)。处理已知异常,稍等片刻(比如 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);
            
        
    

【讨论】:

@Kimmax 这只是简写。 i-- 表示从 i 中减一,然后显然 &gt; 0 大于零。请注意,虽然减少发生在检查大于零之后。因此,这意味着如果i 大于零,则将i 减一并再次循环,当i 不再大于零时,循环将退出。 @pksorensen decrement to zero (LOL) 运算符对太多人来说是不清楚的。当你停下来想“嗯?”时,IMO那你最好改写成更容易理解的东西。归零是可以的(但也应该在 catch 块中更改测试)。 啊,忘了那个!但剩下的只是个玩笑:D不打算破解代码。 @pksorensen 是的,别担心!我在代码中多次看到它,我只是想让答案尽可能地可读,以供未来的读者阅读! 我的 -1 票:HttpClient 专门设计用于持久化并用于多个请求。即使在演示中也不建议为每个请求创建一个新的 HttpClient 对象。【参考方案2】:

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

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

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

【讨论】:

非常感谢您发布这个答案!【参考方案3】:

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

Hosts file is for what?

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

YourServerIP YourDNS

例子:

198.168.1.1 ma​​ps.google.com

【讨论】:

【参考方案4】:

这个问题肯定和c#的HttpClient有关。该客户端旨在重用它。因为在你处理 HttpClient 后套接字并没有直接关闭。这篇博文 (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;

【讨论】:

以上是关于System.Net.WebException:无法解析远程名称:的主要内容,如果未能解决你的问题,请参考以下文章

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

System.Net.WebException:操作已超时

System.Net.WebException HTTP 状态码

System.Net.WebException:请求被中止:请求被取消

ArangoDB-NET 错误:System.Net.WebException:'不知道这样的主机 不知道这样的主机'

System.Net.WebException 的 Powershell 处理