我正在使用System.Net.HttpWebRequest类实现一个简单的HTTP downloader,它可以暂停、取消,甚至可以在取消后恢复(使用HTTP Range请求标头)。
很明显,HttpWebRequest.GetResponse()是当HTTP请求实际发送到服务器时,该方法在接收到HTTP响应(或发生超时)时返回。然而,响应体是用流表示的,这让我想知道响应体实际上是用响应头传输的(即,当GetResponse()返回时它已经被下载了),或者当我试图从响应流中读取时,它是否只按需下载?或者当我调用HttpWebResponse.GetResponseStream()方法时?
不幸的是,msdn文档并没有说明这一点,我对HTTP协议的了解也不足以说明这一点。
在这种情况下,分块传输等行为如何(即,我应该如何在C#应用程序中处理它们)?响应数据是什么时候真正从服务器下载的?
发布于 2011-07-10 23:55:42
这都依赖于TCP,它是HTTP的底层协议。TCP的工作方式是以数据段为单位发送数据。每当客户端向服务器发送数据段时,在发送的数据中包含有关它准备接收多少额外数据的信息。这通常对应于客户端的某种缓冲区。当客户端接收到某些数据时,它还会向服务器发送一个数据段,确认接收到的数据。
因此,假设客户端在处理接收到的数据时非常慢,事件序列可能是这样的:
<代码>G211
关于GetResponse(),这意味着什么?当您调用GetResponse()时,客户端发送请求,读取响应的HTTP头(通常适合一个段,但也可能更多),然后返回。此时,如果您没有开始读取响应流(通过调用GetResponseStream()获得),则会从服务器接收一些数据,但只是为了填充缓冲区。当它已满时,在您开始读取响应流之前,不会再传输任何数据。
https://stackoverflow.com/questions/6641415
复制相似问题