即使像这样使用HttpCompletionOption.ResponseHeadersRead
:
var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://myserver.com");
var request = new HttpRequestMessage(HttpMethod.Get, "huge_file.bin");
var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
一旦SendAsync
被调用,HttpClient就会发出一个GET请求。这一点可以在Fiddler身上看到。
底层HttpClient实际上把请求响应存储在哪里?是在记忆里吗?如果是在内存里,如果React很大,那不会有问题吗?在我的测试中,它似乎不在内存中。它可能是在非用户内存中,比如在内核内存中吗?我不熟悉下载数据时网络内部是如何工作的。
请注意,我不是通过调用例如response.Content.ReadAsStringAsync()
来询问如何使用响应内容。我问的是HttpClient如何在内部读取和存储响应,然后才开始调用response.Content.ReadAsStringAsync()
。
1条答案
按热度按时间ipakzgxi1#
如果使用
ResponseHeadersRead
,它不会将其存储在任何地方。直到您调用ReadAs...
,服务器才完全发送响应。在Fiddler中看到请求:是的,请求发出了,但是它实际上显示了响应中接收到的所有字节吗?
在任何情况下,Fiddler都是一个透明代理,它可能会完全缓存请求和响应,以便对其进行解析。尝试使用Wireshark并观察实际的网络数据包,您将看到响应流没有完全读取,直到您调用
ReadAsStream
并实际读取流中的字节。这就是TCP的工作原理(HTTP在TCP套接字上运行):它在一定量的数据之后等待
ACK
。它可能不仅仅是报头,因为TCP通常在等待ACK
之前推送多个数据包。如果您在足够长的时间之后没有读取数据,服务器将中断连接。