gpt4 book ai didi

c# - HttpWebResponse.GetResponseStream() : when is the response body transmitted?

转载 作者:太空狗 更新时间:2023-10-30 01:09:29 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

  1. 连接已建立,客户端说它准备好接收多少数据。
  2. 服务器向客户端发送一个或多个数据段,其中的总数据量最多为客户端准备接收的数量
  3. 客户端对服务器说:我收到了你发给我的数据,但是暂时不要再发给我了。
  4. 客户端处理部分数据。
  5. 客户端对服务器说:你可以再给我发送x字节的数据

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

关于c# - HttpWebResponse.GetResponseStream() : when is the response body transmitted?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6641415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com