如何收听保持活跃的HttpResponseMessage直到它关闭?

我正在使用HttpClient向远程Web服务器发送异步POST请求。 该远程Web服务器响应Connection标头设置为keep-alive 。 最终,它将关闭连接。

我无法弄清楚怎么做是继续接收数据,直到连接设置为关闭。

例如,请考虑以下代码:

 HttpClient client = new HttpClient(); string requestUri = ...; //My GET uri string content = ...; //url-encoded contents of the request HttpResponseMessage response = await client.PostAsync(requestUri, new StringContent(content)); 

在上面的代码中, responseConnection标头设置为keep-alive 。 我找不到HttpResponseMessage上的任何成员似乎在收到第一个keep-alive后给我任何继续接收信息的方法。

在Connection关闭之前,我无法弄清楚如何继续接收响应。

我能够找到处理发送keep-alive请求的各种资源。 那不是我的问题。 我的问题是接收/处理来自服务器的keep-alive响应。

如果我能提供更多信息以便改进这个问题,请告诉我。

Connection: keep-alive目的不是让服务器为同一个请求发送多个响应 – 这从根本上违反了HTTP的工作方式。

Connection: keep-alive是服务器向客户端发信号的方式,客户端可以使用相同的,已建立的TCP连接提交下一个请求,从而有助于避免建立新连接(以及可能的TLS握手)的成本。

重复使用连接(通常)由底层库处理,并被抽象出来,使得库的用户(如开发人员)不必担心处理。

您应该做的就是继续制作尽可能多的client.Post/Get/etc请求,并且HttpClient库将负责管理底层TCP连接及其重用。

HTTP中有一个区域可能与上述内容背道而驰,因此令人困惑,但事实并非如此。 情况是服务器返回HTTP状态100 Continue 。 在这种情况下,您将看到来自服务器的另一个响应仍然是相同的原始请求(并且“请参阅”我的意思不是来自HttpClient ,而是通过线路,如果您使用WireShark或代理等工具窥探)。 在这种情况下发生的情况是,如果客户端发出大量请求,服务器只是向客户端发出信号,表示它继续接受并读取请求,并且客户端继续发送该原始请求。 收到完整请求后,服务器将处理并回复最终响应代码和消息。 而且, HttpClient将抽象出这个临时100 Continue响应,所以作为开发人员你不必担心它(在大多数情况下(如果不是所有情况))。

如果你想要的只是收到给定请求的响应,你根本不需要处理keep-alive。 Keep-alive纯粹是一种性能优化。 该框架透明地管理连接。

您所做的就是发送请求并收到回复。 每个请求只有一个响应。

一方最终将关闭与您无关的连接。 你没有注意到它的任何影响。