.net 即使使用'HttpCompletionOption.ResponseHeadersRead',HttpClient将响应存储在哪里?

polhcujo  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(107)

即使像这样使用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()

ipakzgxi

ipakzgxi1#

如果使用ResponseHeadersRead,它不会将其存储在任何地方。直到您调用ReadAs...,服务器才完全发送响应。
在Fiddler中看到请求:是的,请求发出了,但是它实际上显示了响应中接收到的所有字节吗?
在任何情况下,Fiddler都是一个透明代理,它可能会完全缓存请求和响应,以便对其进行解析。尝试使用Wireshark并观察实际的网络数据包,您将看到响应流没有完全读取,直到您调用ReadAsStream并实际读取流中的字节。
这就是TCP的工作原理(HTTP在TCP套接字上运行):它在一定量的数据之后等待ACK。它可能不仅仅是报头,因为TCP通常在等待ACK之前推送多个数据包。
如果您在足够长的时间之后没有读取数据,服务器将中断连接。

相关问题