从HTTP下载大文件,在.net中支持恢复/重试

本文关键字:支持 恢复 重试 net 下载 HTTP 文件 | 更新日期: 2023-09-27 18:11:20

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

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

从HTTP下载大文件,在.net中支持恢复/重试

您可以通过以下两种方式之一实现从C#的web服务器从头开始下载:

  1. 在System中使用高级api。网络如HttpWebRequestHttpWebResponseFtpWebRequest等类

  2. 使用System.Net.Sockets中的低级api,如TcpClient, TcpListener和Socket类

使用第一种方法的优点是,您通常不必担心底层管道,例如准备和解释HTTP头以及处理代理,身份验证,缓存等。高级类为您完成了这些工作,因此我更喜欢这种方法。

使用第一种方法,准备从url下载文件的HTTP请求的典型代码看起来像这样:
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"以外的任何值,则不支持此特性。

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

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

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