从.NET下载大文件并在.NET中使用resume / retry支持?

如何在我的应用程序中实现从HTTP下载大文件(~500MB)? 我想支持自动恢复/重试,这样当连接断开连接时,我的应用程序可以尝试重新连接以获取文件并避免重新下载下载的部分,如果可能的话(我知道,这也取决于服务器)。

这类似于下载管理器和某些浏览器中的行为。

您可以通过以下两种方式之一从C#开始从Web服务器下载:

  1. 使用System.Net中的高级API,例如HttpWebRequestHttpWebResponseFtpWebRequest和其他类。

  2. 使用System.Net.Sockets中的低级API,如TcpClientTcpListener和Socket类。

使用第一种方法的优点是,您通常不必担心低级别的管道,例如准备和解释HTTP标头以及处理代理,身份validation,缓存等。高级类为您执行此操作,因此我更喜欢这种方法。

使用第一种方法,准备HTTP请求以从URL下载文件的典型代码将如下所示:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); if (UseProxy) { request.Proxy = new WebProxy(ProxyServer + ":" + ProxyPort.ToString()); if (ProxyUsername.Length > 0) request.Proxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword); } //HttpWebRequest hrequest = (HttpWebRequest)request; //hrequest.AddRange(BytesRead); ::TODO: Work on this if (BytesRead > 0) request.AddRange(BytesRead); WebResponse response = request.GetResponse(); //result.MimeType = res.ContentType; //result.LastModified = response.LastModified; if (!resuming)//(Size == 0) { //resuming = false; Size = (int)response.ContentLength; SizeInKB = (int)Size / 1024; } acceptRanges = String.Compare(response.Headers["Accept-Ranges"], "bytes", true) == 0; //create network stream ns = response.GetResponseStream(); 

在上面的代码的末尾,您将获得一个网络流对象,然后您可以使用该对象读取远程文件的字节,就像您正在读取任何其他流对象一样。 现在,远程URL是否支持通过允许您从任何任意位置读取来恢复部分下载由“Accept-Ranges” HTTP头确定,如上所示。 如果此值设置为“bytes”以外的任何值,则不支持此function。

实际上,这段代码是我尝试在C#中实现的更大的开源下载管理器的一部分。 您可以参考此应用程序,看看是否有任何对您有所帮助: http : //scavenger.codeplex.com/

有自动恢复/重试支持的开源.Net http文件下载器(如果服务器支持它),看起来它正是你需要的,可以尝试使用它:

https://github.com/Avira/.NetFileDownloader

有一个Internet Download Manager支持您来处理这个问题。 下载IDMCOMAPI.zip ,然后使用( Tlbimp )类型库导入程序,从提取的zip中导入文件IDManTypeInfo.tlb

cmd

 C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\TlbExp.exe (FilePathGoesHere)\IDManTypeInfo.tlb 

做记录:

1.)您应该以管理员模式运行Command Prompt

2.)有些文件没有恢复function。