我正在测试一个端点,我遇到了一些问题.
我只是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); } } } }