【问题标题】:HttpClient hangs when timeout is setting (Windows Phone)设置超时时 HttpClient 挂起(Windows Phone)
【发布时间】:2013-08-14 11:56:59
【问题描述】:

我正在尝试在 Windows Phone 应用程序中将超时设置为 HttpClient 对象。但是如果请求在超时之前没有完成,GetAsync 永远不会返回值。

我正在使用以下代码来获得响应:

HttpClientHandler handler = new HttpClientHandler();
HttpClient client = new HttpClient(handler);
client.Timeout = TimeSpan.FromSeconds(5);
client.BaseAddress = new Uri("http://www.foo.com");
HttpResponseMessage response = await client.GetAsync("/boo.mp3");//<--Hangs
byte[] data = await response.Content.ReadAsByteArrayAsync();

如何正确设置超时以从 GetAsync 获取结果?

【问题讨论】:

  • 你到底是怎么调用这个方法的?你用的不是Wait()Result
  • 我也有类似的问题。就我而言,我已经 try..catch() 包裹了任务中的所有内容,在多个级别上,以及所有日志,甚至在每个步骤之间。我有返回任务的方法,然后我登录,然后我 .Wait() 就可以了。我正在使用默认超时(我猜是 100 秒?)。如果 Web 服务响应 GetAsync() 调用的时间过长,则它永远不会返回。它没有遇到任何问题。它不会命中下一行(这是一个日志)。它只是永远挂起。

标签: c# windows-phone-8 async-await dotnet-httpclient


【解决方案1】:

取自HttpClient documentation

默认值为 100,000 毫秒(100 秒)。

域名系统 (DNS) 查询最多可能需要 15 秒才能返回 或超时。如果您的请求包含需要 分辨率并且您将 Timeout 设置为小于 15 秒的值,它可能 在引发 WebException 之前需要 15 秒或更长时间以指示 您的请求超时。

正如 ZombieSheep 所说,5 秒甚至不足以完成 DNS 查询。

我建议也删除超时并将其设置为默认值,因为据我所知,“检查”任务是否停止的唯一方法是假设如果您 p​​ing 服务器并且它回复连接是仍然“正常”并且正在工作/下载您的文件。

【讨论】:

    【解决方案2】:

    如果不去编写代码来检查,这里有一些可能的罪魁祸首。

    1) 您的 5 秒超时时间不足以下载完整文件“boo.mp3”,因此超时会停止操作。
    2) 您的网络服务器响应时间过长(不太可能,但可以通过移动网络)

    最好完全删除超时值,或者将其设置为更实际的值。

    【讨论】:

    • 是的,它会停止操作。但我找不到检查任务是否因超时而停止的方法。
    • @MikhailKamenev ,您可以捕获 HttpRequestException 。例如尝试 { 返回等待 httpHandler.SendAsync(...); } 捕捉(HttpRequestException e){ }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多