我正在使用System.Net.HttpWebRequest类来实现一个简单的HTTP下载程序,该程序在取消后可以暂停,取消甚至恢复(使用HTTP范围请求标头)。
很明显,HttpWebRequest.GetResponse()是HTTP请求实际发送到服务器的时间,并且该方法在收到HTTP响应(或发生超时)时返回。但是,响应主体用Stream表示,这让我想知道响应主体是否实际上与响应头一起传输(即,当GetResponse()返回时它已经下载),或者只是按需下载,当我尝试时从响应流中读取?或者当我调用HttpWebResponse.GetResponseStream()方法时?
不幸的是,msdn文档没有说明,而且我对HTTP协议的了解还不够。
在这种情况下,如何进行分块传输等(也就是说,我应该如何在C#应用程序中处理它们)?什么时候实际上是从服务器下载的响应数据?
答案 0 :(得分:5)
这一切都取决于TCP,HTTP的底层协议。 TCP的工作方式是数据以段的形式发送。每当客户端向服务器发送一个段时,发送的数据就是它准备好接收多少额外数据的信息。这通常对应于客户端的某种缓冲区。当客户端收到一些数据时,它还会向服务器发送一个段,确认收到的数据。
因此,假设客户端处理接收到的数据非常慢,事件序列可能如下:
这对GetResponse()
有什么意义?当您调用GetResponse()
时,客户端发送请求,读取响应的HTTP标头(通常适合一个段,但可能更多)并返回。此时,如果您没有开始读取响应流(通过调用GetResponseStream()
获得),则会收到来自服务器的一些数据,但仅用于填充缓冲区。当它已满时,在您开始读取响应流之前不会再传输数据。