我正在测试一个端点,我遇到了一些问题。
我只是在每小时执行一次请求的循环中使用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
获取更多信息,还是需要更高级的诊断工具?
答案 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 **。
在此文件末尾添加以下内容:
您的服务器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;