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

C# System.Net.WebException:无法解析远程名称:,c#,.net,system.net.webexception,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.WebExce

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

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

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


这可能会发生,但你无能为力

我建议始终使用
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);
            }
        }
    }
}
private const int NumberOfRetries=3;
private const int DelayOnRetry=1000;
公共静态异步任务GetFromUrlAsync(字符串url){
使用(var client=new HttpClient()){

对于(int i=1;i我在尝试访问服务(旧的ASMX服务)时遇到了类似的问题。通过IP访问时,呼叫将正常工作,但使用别名呼叫时,我将无法解析远程名称

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

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

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

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

YourServerIPYourDNS

例如:


198.168.1.1maps.google.com

如果您愿意,您可以在此处共享实际的URL,我们可以查看是否每个人都无法通过这种方式访问,但这似乎是某些服务的本地故障。您是否厌倦了在连接属性中切换DNS服务器?(例如8.8.8.8上的google DNS)没有。我什么都没试过。感觉就像是网站闲置了一段时间,然后第一个请求就把它唤醒了。看起来奇怪的是[Fiddler]DNS查找“url”失败的.System.Net.Sockets.SocketException这通常是主机名解析期间的临时错误,意味着本地服务器没有收到来自权威服务器的响应try
ipconfig/flushdns
并临时更改DNSserver@Kimmax这只是简写。
i--
的意思是从i中减去一,然后再加上obviously
>0
大于零。请注意,尽管减量是在检查是否大于零后发生的。因此,这意味着如果
i
大于零,则减量
i
一次,然后再次循环,当
i
不再大于零时,循环将退出。@pksorensen减量为零(LOL)操作员对太多人不清楚。当你停下来思考“嗯?”时,你最好重写为更容易理解的内容。归零是可以的(但也应该在catch block中更改测试).ah ye,忘了那个!但剩下的只是一个笑话:D不打算破坏代码。@pksorensen是的,别担心!我在代码中看到过很多次,我只是想让答案尽可能可读,以供未来读者阅读!我的-1票:HttpClient是专门为持久化而设计的,可用于多个请求。创建一个新的HttpClient即使在演示中也不推荐每个请求都使用对象。非常感谢您发布此答案!