以可重启模式并行下载多个块中的文件

问题描述 投票:0回答:2

我需要通过相当慢的网络连接使用 HTTP 协议下载大文件。手动执行时,下载速度有时会慢得难以忍受,并且进程有时会冻结或终止。

对于手动下载,可以通过使用下载管理器(例如FDM)来大大改善这种情况 - 这类程序在十年左右前是不可或缺且非常流行的,但由于现在更好更快,其使用量很快就减少了网络可用 - 它从不同位置开始以块的形式并行启动同一文件的多个下载会话,自动重新启动失败或过时的会话,实现工作平衡(成功下载一个块后,将一些仍在下载的剩余块分割成两个)会话),并最终将所有下载的块拼接成一个完整的单个文件。总的来说,它可以在连接不良的情况下使文件下载更加稳健且更快。

现在我正在尝试在 C# 中实现相同的下载行为,以实现自动无人值守下载。我看不到 .NET 框架中任何现有的类实现此功能,因此我正在寻求如何手动实现它的建议(可能需要借助一些开源 .NET 库)。

c# .net http parallel-processing download
2个回答
2
投票

这可以使用 HttpWebRequest.AddRange 方法实现,该方法允许您从特定范围获取文件的字节。因此,当文件存在时,读取字节数并将其通过 HttpWebRequest.AddRange 传递。请参阅 Codeproject 中的代码示例:

http://www.codeproject.com/Tips/307548/Resume-Suppoert-Downloading

有关传递不同类型范围的其他信息,请参阅:http://msdn.microsoft.com/en-us/library/4ds43y3w.aspx


0
投票

我也遇到过同样的问题,尤其是在开放空间中,网络连接可能非常慢,有时服务器会限制连接。

我发现

https://www.nuget.org
上的 DownloadAssistant 解决方案对我很有帮助。它下载文件并且还支持块,但不会使网络过载,因为您可以限制一次下载的速度。它还调节一次最大下载量。

这个库似乎完全符合您的要求:

它从不同位置开始并行启动同一文件的多个块下载会话,自动重新启动失败或过时的会话,并实现工作平衡(成功下载一个块后,会分割一些仍在下载的剩余块)。

但是,与所有解决方案一样,它也有其优点和缺点:

优点:

  • 分块下载:允许将大文件的下载分解为更小的部分。
  • 节流:控制下载速度的能力可以防止网络过载,这在带宽有限的环境中特别有用。
  • 自动重启:库可以自动重启失败的会话,这在处理不可靠的网络连接时可以成为救星。

缺点:

  • Dependency:使用此库意味着向您的项目添加外部依赖项。如果不维护该库,将来可能会导致问题。我不知道,但它可能包含错误。
  • 学习曲线:与任何库一样,理解如何有效使用它都有一个学习曲线。

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.