如何实现我的应用程序从HTTP下载大文件(500MB〜)? 我想支持自动恢复/重试,以便当连接断开时,我的应用程序可以尝试重新连接到获取文件,避免重新下载下载的部分,如果可能的话(我知道,这取决于服务器以及)。
这类似于在下载管理器和一些浏览器的行为。
如何实现我的应用程序从HTTP下载大文件(500MB〜)? 我想支持自动恢复/重试,以便当连接断开时,我的应用程序可以尝试重新连接到获取文件,避免重新下载下载的部分,如果可能的话(我知道,这取决于服务器以及)。
这类似于在下载管理器和一些浏览器的行为。
您可以实现从一个网络服务器下载C#
中的两种方式之一从头开始:
使用System.Net高层次的API,如HttpWebRequest
, HttpWebResponse
, FtpWebRequest
和其他类。
在的System.Net.Sockets如使用低级别API TcpClient
, TcpListener
和Socket类。
使用第一种方法的好处是,你通常不必担心如此低的水平管道如准备和解释HTTP标头和处理代理,认证,缓存等的高层次类你,因此这样做我更喜欢这种方法。
使用第一种方法,典型的代码编写一个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是否支持通过允许用户从任何arbitary位置读取由“接受范围” HTTP标头,如上面所示确定恢复部分下载。 如果这个值被设置为“字节”以外的其他,则此功能将不被支持。
事实上,这个代码是我想在C#中实现更大的开源下载管理器的一部分。 你可以参考这个应用程序,看看是否有任何可以帮助你: http://scavenger.codeplex.com/
有自动恢复开源的.Net HTTP文件下载/重试的支持(如果服务器支持它),看起来像您需要什么,可以尝试使用它:
https://github.com/Avira/.NetFileDownloader 。
有一个互联网下载管理器支持为您处理这个问题。 下载IDMCOMAPI.zip
与(,然后TLBIMP )类型库导入,导入文件IDManTypeInfo.tlb
从提取的拉链。
CMD:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\TlbExp.exe (FilePathGoesHere)\IDManTypeInfo.tlb
做记录:
1)您应该运行Command Prompt
在管理员模式。
2)有没有恢复能力的一些文件。