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

我只是用 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);
            }
        }
    }
}

其他提示

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

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

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

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

Hosts文件是为了什么?

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

你的个人资料 你的女儿

例子::

198.168.1.1 maps.google.com

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top