2

我有一个 webrequest,它创建了与服务器的持久(keepalive)连接,例如:

webRequest.ContentType = "application/x-www-form-urlencoded";
                    // Set the ContentLength property of the WebRequest.
                    webRequest.ContentLength = byteArray.Length;
                    webRequest.Timeout = Timeout.Infinite;
                    webRequest.KeepAlive = true;
                    webRequest.ReadWriteTimeout = Timeout.Infinite;
                    //[System.Threading.Timeout]::Infinite

                    webRequest.UserAgent = "www.socialblazeapp.com";
                    Stream dataStream = webRequest.GetRequestStream();
                    // Write the data to the request stream.
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    // Close the Stream object.
                    dataStream.Close();
                    // Get the response.
                    webResponse = (HttpWebResponse)webRequest.GetResponse();
                    Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
                    responseStream = new StreamReader(webResponse.GetResponseStream(), encode);
                    while(!responseStream.EndOfStream){ //do something}

我想知道为什么 responseStream.EndOfStream 会在一段时间后变为真。我会假设因为这是一个持久连接,所以流永远不会关闭?

任何想法为什么会发生这种情况?

4

2 回答 2

2

我认为您将保持 TCP 连接打开与保持响应流打开混淆了。TCP 连接是底层传输介质,而请求和响应是通过该连接进行通信的单独实体。

通过持久连接,您 [理论上] 可以在同一连接上发出多个请求/响应对。如果没有持久连接,您实际上将打开连接,发出请求,接收响应,然后关闭连接,然后为后续的请求/响应对重复该过程。

然而,响应本身的大小是有限的,一旦您收到完整的响应,流应该关闭,因为没有什么可以告诉您的了。一旦您发出另一个请求,就会有另一个响应;我不清楚.Net 是否会重用底层的持久连接。

于 2010-06-22T00:37:27.567 回答
1

应该做的就是保持 TCP 连接打开。如果我没看错,这意味着您可以对给定服务器的多个请求重用相同的物理 TCP 连接。它不会做的是让您的流保持打开状态,以便服务器可以发送其他信息。

如果你真的想要流数据,你应该使用不同的协议或直接 TCP。

于 2010-06-22T00:36:37.137 回答