6

我正在尝试为HttpClientWindows Phone 应用程序中的对象设置超时。但是如果请求在超时之前没有完成,则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 获取结果?

4

2 回答 2

9

取自HttpClient 文档

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

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

正如 ZombieSheep 指出的那样,即使完成 DNS 查询,5 秒也是不够的。

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

于 2013-08-15T06:33:46.003 回答
2

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

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

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

于 2013-08-14T12:11:26.260 回答