首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpWebResponse.GetResponseStream():何时发送响应体?

HttpWebResponse.GetResponseStream():何时发送响应体?
EN

Stack Overflow用户
提问于 2011-07-10 21:39:57
回答 1查看 2K关注 0票数 4

我正在使用System.Net.HttpWebRequest类实现一个简单的HTTP downloader,它可以暂停、取消,甚至可以在取消后恢复(使用HTTP Range请求标头)。

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

不幸的是,msdn文档并没有说明这一点,我对HTTP协议的了解也不足以说明这一点。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-10 23:55:42

这都依赖于TCP,它是HTTP的底层协议。TCP的工作方式是以数据段为单位发送数据。每当客户端向服务器发送数据段时,在发送的数据中包含有关它准备接收多少额外数据的信息。这通常对应于客户端的某种缓冲区。当客户端接收到某些数据时,它还会向服务器发送一个数据段,确认接收到的数据。

因此,假设客户端在处理接收到的数据时非常慢,事件序列可能是这样的:

  1. 连接建立后,客户端表示准备好多少数据段将一个或多个数据段发送到客户端,其中的总数据至多等于客户端表示可以接收的数据量
  2. 客户端对服务器说:我收到了您发送给我的数据,但现在不要再发送了。
  3. 客户端处理部分数据。
  4. 客户端对服务器说:您可以再发送x字节的数据

<代码>G211

关于GetResponse(),这意味着什么?当您调用GetResponse()时,客户端发送请求,读取响应的HTTP头(通常适合一个段,但也可能更多),然后返回。此时,如果您没有开始读取响应流(通过调用GetResponseStream()获得),则会从服务器接收一些数据,但只是为了填充缓冲区。当它已满时,在您开始读取响应流之前,不会再传输任何数据。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6641415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档