【问题标题】:How do I download a file in segments in C#?如何在 C# 中分段下载文件?
【发布时间】:2017-06-08 17:07:07
【问题描述】:

我正在使用 HttpWebRequest 和 AddRange 函数,例如:

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
myHttpWebRequest.AddRange(20, 30);
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Stream streamResponse = myHttpWebResponse.GetResponseStream();
SaveFileStream(name, streamResponse); //save file function

...但是下载了整个文件。

上述代码中的

AddRange() 期望下载 20 到 30 之间的字节(换句话说,从文件中下载这 10 个字节)。

但我的代码不起作用,因为下载没有分段。此链接提供了一个示例:http://stackoverflow.com/robots.txt 该文件已完整下载。为什么?

【问题讨论】:

标签: c# download httpwebrequest


【解决方案1】:

HTTP 服务器不需要支持 Range 标头请求。您可以通过发出 HEAD 请求并在响应中检查 Accept-Ranges 标头的值来验证服务器的范围支持(请参阅 HTTP range requests)。但这仍然不能保证服务器不会忽略 Range 标头,尤其是对于非常小的范围(HTTP 服务器在如此小的段中提供内容会非常低效)。

来自RFC7233

因为服务器可以随意忽略 Range,所以许多实现会 只需用 200 (OK) 中的整个选定表示进行响应 回复。这部分是因为大多数客户准备接受 200(OK)完成任务(尽管效率较低)和部分 因为客户端可能不会停止发出无效的部分请求,直到 他们收到了完整的代表。因此,客户无法 取决于收到 416(范围不可满足)响应,即使在 这是最合适的。

要确定服务器是否接受或忽略Range 标头,您必须检查响应状态代码。 200 (OK) 表示服务器忽略了Range 标头并返回了整个响应正文,206 (Partial Content) 表示标头中指定的范围已由服务器返回,416 (Range Not Satisfiable) 表示由于无效范围或对小范围或重叠范围的过多请求。

http://stackoverflow.com/robots.txt 的情况下,服务器通过在HEAD 请求的响应中返回Accept-Ranges: bytes 标头来指示支持Range 标头,但在指定了AddRange(20, 30) 的GET 请求中,响应为@ 987654336@,所以服务器只是忽略了这么小的范围返回的整个响应体。如果需要,您必须自己从响应中删除请求的范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2016-10-14
    • 2010-11-02
    相关资源
    最近更新 更多