【问题标题】:operation inconsistency between .net 3.0 and .net 4.5 DownloadFileAsync.net 3.0 和 .net 4.5 DownloadFileAsync 之间的操作不一致
【发布时间】:2015-07-21 23:59:06
【问题描述】:

以下代码:

WebClient client = new WebClient();
client.DownloadProgressChanged += DownloadProgressChanged;
client.DownloadFileCompleted += DownloadFileCompleted;
client.DownloadFileAsync(new Uri(downloadUrl), downloadPath);

在 .NET 4.5 中运行良好 - 它可以毫无问题地下载文件,但在 .NET 3.0 或 3.5 中它不起作用 - 文件显示为 0kb。

有人知道为什么会出现这种差异吗?我想知道 4.5 包含的 3.0 中是否缺少一些额外的标头?

它也不会抛出任何错误。

更新:

最终抛出“操作已超时”。例外。

更新 #2:

我从 HTTPS 更改为 HTTP,这似乎在我的特定情况下有效。实际上,我的 HTTP 调用将其重定向到 HTTPS。但是,使用 .NET 3.0 直接访问 HTTPS 对我不起作用。

【问题讨论】:

  • 这两个事件都被触发了吗?如果是这样,会发生什么?
  • 乔恩,没有任何事件触发(.NET 3.0)。轻微更新 - 我收到“操作已超时”。为了发生异常,我坚持了一段时间。
  • 如果这是 HTTP,我建议您使用 Wireshark 来查看每种情况下发生的情况。
  • 这是一个异步方法,所以它会在调用后立即退出。但是,这并不意味着它停止执行下载文件所需的操作。与 Jon Skeet 的问题一样,Progress Changed/File completed 会触发吗?我没有看到您处理任何可能发生的潜在错误。可能是文件无法再次下载(覆盖)或由于某种原因发生超时?
  • 更新:抛出上述异常。奇怪的是,如果我将 .NET 版本从一个切换到另一个,它工作正常,反之亦然。我希望我不需要 Wireshark,但我刚刚下载了它,所以我会记录我的发现。

标签: c# .net-4.5 .net-3.0


【解决方案1】:

默认超时时间可能因框架版本而异。 Web.config 文件中的绑定配置就是这种情况,所以我怀疑这里也是这种情况。

我建议创建一个派生的 WebClient 类并重写 GetWebRequest 方法以设置自定义超时,如此线程中所建议的:https://stackoverflow.com/a/3052637/2046539,其灵感来自这篇博文:http://w3ka.blogspot.be/2009/12/how-to-fix-webclient-timeout-issue.html

作为一般规则:永远不要相信默认值。您应该始终使用自己的价值观。大多数情况下,默认值没有记录在案,只是一个实现细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2010-10-07
    • 2020-01-27
    • 2014-01-18
    • 2011-05-22
    相关资源
    最近更新 更多