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

Pou*_*sen 30 .net c# system.net.webexception

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

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

var httpClient = new HttpClient();
var message = httpClient.GetAsync(url).Result;
Console.WriteLine(message.StatusCode);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Adr*_*tti 39

可能是由本地网络连接问题引起的(但也可能是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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @pksorensen _decrement to zero_(LOL)运算符对于太多人来说并不清楚.IMO当你停下来思考"呃?" 然后你最好重写一些更容易理解的东西.变为零是可以的(但是应该更改catch块中的测试). (3认同)

小智 6

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

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

<system.net>
    <defaultProxy enabled="true">
    </defaultProxy>
</system.net>
Run Code Online (Sandbox Code Playgroud)