什么时候C#Webclient.OpenRead实际下载数据?

时间:2017-02-09 19:14:11

标签: c# .net

我找到了Python的this answer。它适用于C#WebClient.OpenRead吗?

在以下示例中:

  1. OpenRead是否一次下载所有csv文件(因此ReadLine引用本地流)?
  2. 与Python一样,下载是否通过连续的ReadLine逐步完成?
  3. 代码示例

    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
    }
    

2 个答案:

答案 0 :(得分:2)

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

ConnectStream in reference source

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

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

严格来说,它永远不会是“本地流”,但是底层缓冲区将保留所请求文件的数量(如果不是全部的话),而不是你在第一次阅读时要求的数据。

答案 1 :(得分:0)

根据documentation判断,只要您拨打OpenRead

,就会发送HTTP GET请求
  

从资源中打开数据已下载的可读流   指定为String的URI。