如何监听一个保持活跃的HttpResponseMessage,直到它关闭
本文关键字:HttpResponseMessage 活跃 监听 何监听 一个 | 更新日期: 2023-09-27 18:03:26
我使用HttpClient
发送异步POST请求到远程web服务器。该远程web服务器响应连接头设置为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));
在上面的代码中,response
将把Connection
标头设置为keep-alive
。我找不到HttpResponseMessage上的任何成员,似乎给了我任何在收到第一个keep-alive
后继续接收信息的方法。
我不知道如何继续接收响应,直到连接关闭。
我能够找到处理发送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纯粹是一种性能优化。框架透明地管理连接。
你所要做的就是发送请求并接收响应。每个请求只有一个响应。
一方最终会关闭与你无关的连接。你不会注意到任何效果