【问题标题】:When do a C# Webclient.OpenRead actually download data?C# Webclient.OpenRead 何时实际下载数据?
【发布时间】:2017-02-10 09:28:28
【问题描述】:

我为 Python 找到了 this answer。是否适用于 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
}

【问题讨论】:

  • 你不是说new StreamReader(stream) 吗?
  • source code,好像回复一下子就下载好了,虽然我也不是很确定(所以只能评论)。
  • 您询问的是 OpenRead 和 csv 文件,而您的 StreamReader 使用的是 csv 文件而不是 WebClient。您能否再次查看您的问题?
  • 我的错。我已经更正了代码示例。

标签: c# .net


【解决方案1】:

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

ConnectStream in reference source

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

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

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

【讨论】:

    【解决方案2】:

    documentation来看,只要调用OpenRead就会发送HTTP GET请求

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2012-03-27
      • 1970-01-01
      相关资源
      最近更新 更多