c# - 在 .NET 中使用恢复/重试支持从 HTTP 下载大文件?

标签 c# .net http file-io web

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

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

最佳答案

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

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

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

使用第一种方法的优点是您通常不必担心低级管道,例如准备和解释 HTTP header 以及处理代理、身份验证、缓存等。高级类这样做是为了你,因此我更喜欢这种方法。

使用第一种方法,准备从 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 header 确定的,如上所示。如果此值设置为“字节”以外的任何值,则将不支持此功能。

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

关于c# - 在 .NET 中使用恢复/重试支持从 HTTP 下载大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270216/

相关文章:

http - 带有喷雾示例的分块响应处理

c# - Github OAuth : The remote server returned an error (403) Forbidden

android - 如何在 android 中进行 HTTPS 流式传输?

c# - MVC、C# 中的小数符号问题?

c# - 如何在具有良好音频的Unity 5.6中更改视频的速度?

c# - Audit.NET 连接对象保存问题

c# - 如何修复不可信数据的反序列化

c# - 如何使用WCF和MSMQ在C#中实现单发布者和多订阅者异步消息系统?

c# - 想在桌面或任何位置看到输出 "data.csv"

.net - 如何从 kubernetes 部署配置文件中的 helm 获取运行时设置以覆盖 asp.net 中的 appsettings