C# Webclient.OpenRead 何时实际下载数据?



我为Python找到了这个答案。它适用于C# WebClient.OpenRead吗?

在以下示例中:

  1. OpenRead 是否一次下载所有 csv 文件(因此 ReadLine 指的是本地流)?
  2. 就像在Python中一样,下载是否是使用连续的ReadLine逐步完成的?

代码示例

WebClient client = new WebClient();
Stream stream = client.OpenRead("http://www.MyWebsite.com/FileToDownload.csv");
StreamReader csvFile= new StreamReader(stream);
while (!csvFile.EndOfStream)
{
string line = csvFile.ReadLine();
//do stuff with line
}

这取决于协议、下载大小与缓冲区大小,甚至可能取决于 Web 服务器配置。内部使用的HttpWebResponse的实现从能够透明地去分块的ConnectStream读取所有内容:

参考源中的连接流

即使在需要解码或解压缩的情况也会正确链接,因此实现显然能够流式传输数据,而无需预先在本地下载所有内容。
实际上,.NET http 堆栈缓冲区会尽可能多地立即使用,当您不读取流以结束时也是如此。这些帖子可能很有趣:

  • https://weblog.west-wind.com/posts/2014/jan/29/using-net-httpclient-to-capture-partial-responses
  • 如何使用System.Net.HttpClient检索部分响应

为了证明您的情况,请打开网络跟踪,因为 HttpWebResponse 将转储有关连接、延续等的信息。或使用任何其他网络嗅探工具。确保文件足够大以查看效果。

严格来说,它永远不会是"本地流",但底层缓冲区将容纳比您在第一次读取时请求的更多(如果不是全部)请求的文件。

从文档来看,HTTP GET请求在您调用OpenRead后立即发送

打开从资源下载的数据的可读流 指定为字符串的 URI。

最新更新