HttpWebResponse.GetResponseStream():何时传输响应体?

时间:2011-07-10 13:39:57

标签: c# .net http httpwebrequest

我正在使用System.Net.HttpWebRequest类来实现一个简单的HTTP下载程序,该程序在取消后可以暂停,取消甚至恢复(使用HTTP范围请求标头)。

很明显,HttpWebRequest.GetResponse()是HTTP请求实际发送到服务器的时间,并且该方法在收到HTTP响应(或发生超时)时返回。但是,响应主体用Stream表示,这让我想知道响应主体是否实际上与响应头一起传输(即,当GetResponse()返回时它已经下载),或者只是按需下载,当我尝试时从响应流中读取?或者当我调用HttpWebResponse.GetResponseStream()方法时?

不幸的是,msdn文档没有说明,而且我对HTTP协议的了解还不够。

在这种情况下,如何进行分块传输等(也就是说,我应该如何在C#应用程序中处理它们)?什么时候实际上是从服务器下载的响应数据?

1 个答案:

答案 0 :(得分:5)

这一切都取决于TCP,HTTP的底层协议。 TCP的工作方式是数据以段的形式发送。每当客户端向服务器发送一个段时,发送的数据就是它准备好接收多少额外数据的信息。这通常对应于客户端的某种缓冲区。当客户端收到一些数据时,它还会向服务器发送一个段,确认收到的数据。

因此,假设客户端处理接收到的数据非常慢,事件序列可能如下:

  1. 建立连接,客户端表示可以接收多少数据。
  2. 服务器向客户端发送一个或多个段,其中的总数据最多为客户端表示已准备好接收的数据
  3. 客户对服务器说:我收到了您发给我的数据,但暂时不再发送给我了。
  4. 客户处理部分数据。
  5. 客户端对服务器说:您可以向我发送x个更多字节的数据
  6. 这对GetResponse()有什么意义?当您调用GetResponse()时,客户端发送请求,读取响应的HTTP标头(通常适合一个段,但可能更多)并返回。此时,如果您没有开始读取响应流(通过调用GetResponseStream()获得),则会收到来自服务器的一些数据,但仅用于填充缓冲区。当它已满时,在您开始读取响应流之前不会再传输数据。

相关问题