我需要通过相当慢的网络连接使用 HTTP 协议下载大文件。手动执行时,下载速度有时会慢得难以忍受,并且进程有时会冻结或终止。
对于手动下载,可以通过使用下载管理器(例如FDM)来大大改善这种情况 - 这类程序在十年左右前是不可或缺且非常流行的,但由于现在更好更快,其使用量很快就减少了网络可用 - 它从不同位置开始以块的形式并行启动同一文件的多个下载会话,自动重新启动失败或过时的会话,实现工作平衡(成功下载一个块后,将一些仍在下载的剩余块分割成两个)会话),并最终将所有下载的块拼接成一个完整的单个文件。总的来说,它可以在连接不良的情况下使文件下载更加稳健且更快。
现在我正在尝试在 C# 中实现相同的下载行为,以实现自动无人值守下载。我看不到 .NET 框架中任何现有的类实现此功能,因此我正在寻求如何手动实现它的建议(可能需要借助一些开源 .NET 库)。
这可以使用 HttpWebRequest.AddRange 方法实现,该方法允许您从特定范围获取文件的字节。因此,当文件存在时,读取字节数并将其通过 HttpWebRequest.AddRange 传递。请参阅 Codeproject 中的代码示例:
http://www.codeproject.com/Tips/307548/Resume-Suppoert-Downloading
有关传递不同类型范围的其他信息,请参阅:http://msdn.microsoft.com/en-us/library/4ds43y3w.aspx
我也遇到过同样的问题,尤其是在开放空间中,网络连接可能非常慢,有时服务器会限制连接。
我发现
https://www.nuget.org上的
DownloadAssistant
解决方案对我很有帮助。它下载文件并且还支持块,但不会使网络过载,因为您可以限制一次下载的速度。它还调节一次最大下载量。
这个库似乎完全符合您的要求:
它从不同位置开始并行启动同一文件的多个块下载会话,自动重新启动失败或过时的会话,并实现工作平衡(成功下载一个块后,会分割一些仍在下载的剩余块)。
但是,与所有解决方案一样,它也有其优点和缺点:
优点:
缺点:
我希望这有帮助!