繁体   English   中英

如何在C#中按段下载文件?

[英]How do I download a file in segments in C#?

我正在将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该文件是完整下载的。 为什么?

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

RFC7233

由于服务器可以随意忽略Range,因此许多实现都将简单地以200(OK)响应来响应整个选定的表示形式。 这部分是因为大多数客户端准备好接收200(确定)以完成任务(尽管效率较低),部分原因是客户端在收到完整的表示之前可能不会停止发出无效的部分请求。 因此,即使最合适,客户端也不能依赖于接收到416(不满足范围)响应。

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

http://stackoverflow.com/robots.txt的情况下,服务器通过响应HEAD请求,但在指定了AddRange(20,30)的GET请求中,通过返回Accept-Ranges: bytes标头来指示对Range标头的支持200 (OK) ,因此服务器只是忽略了这么小的范围而返回了整个响应正文。 如果需要,您必须自己减少响应范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM