从HTTP下载大文件,恢复/重试在.NET的支持?(Download large file from

2019-09-01 08:05发布

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

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

Answer 1:

您可以实现从一个网络服务器下载C#中的两种方式之一从头开始:

  1. 使用System.Net高层次的API,如HttpWebRequestHttpWebResponseFtpWebRequest和其他类。

  2. 在的System.Net.Sockets如使用低级别API TcpClientTcpListener和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/



Answer 2:

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

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



Answer 3:

有一个互联网下载管理器支持为您处理这个问题。 下载IDMCOMAPI.zip与(,然后TLBIMP )类型库导入,导入文件IDManTypeInfo.tlb从提取的拉链。

CMD:

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

做记录:

1)您应该运行Command Prompt在管理员模式。

2)有没有恢复能力的一些文件。



文章来源: Download large file from HTTP with resume/retry support in .NET?