问题
I'm using HttpClient
to send an asynchronous POST request to a remote web server. That remote web server responds with the Connection header set to keep-alive
. Eventually, it will close the connection.
What I can't figure out how to do is keep receiving data until the connection is set to close.
For example, consider the following code:
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));
In the code above, response
will have the Connection
header set to keep-alive
. I couldn't find any members on HttpResponseMessage that seem to give me any means of continuing to receive information after the first keep-alive
is received.
I can't figure out how to continue receiving responses until the Connection closes.
I was able to find all sorts of resources that dealt with sending keep-alive
requests. That's not my issue. My issue is in receiving/handling a keep-alive
response from the server.
Please let me know if there is anymore information that I could provide to improve this question.
回答1:
Connection: keep-alive
purpose is not to enable server to send multiple responses for the same single request - this would fundamentally violate how HTTP works.
Connection: keep-alive
is server's way of signaling to the client that client can submit next request using the same, already established, TCP connection, thus help avoid the costs of establishing new connection (and possibly TLS handshake as well).
Reuse of the connection is (typically) handled by underlying library, and is abstracted away such that user (as in developer) of the library need not worry about handling.
All you should be doing is keep making as many client.Post/Get/etc
requests, and the HttpClient
library will take care of managing the underlying TCP connection and its reuse.
There is one area in HTTP that may look counter to the above and thus confusing, but is not. The case is when server returns HTTP Status 100 Continue
. In this case you will see another response come from the server for still the same original request (and by "see" I mean not from HttpClient
, but rather on the wire if you were to snoop with a tool like WireShark or a proxy). What is happening in this case is if a client is making a large request, the server simply signals to the client that it is continuing to accept and read request, and for the client to continue sending that original request. Once full request is received, the server will process and respond with a final response code and message. And again, HttpClient
will abstract away this interim 100 Continue
response, so as developer you need not worry about it (in most if not all cases).
回答2:
If all you want is receive the response for a given request you don't need to deal with keep-alive at all. Keep-alive is purely a performance optimization. The framework transparently manages connections.
All you do is send a request and receive a response. There is exactly one response per request.
One side will eventually close the connection which is not of any concern to you. You don't notice any effect of that.
来源:https://stackoverflow.com/questions/23660773/how-to-listen-to-a-keep-alive-httpresponsemessage-until-its-closed