Почему я получаю endOfStream в веб-запросе, если это постоянное (keepalive) соединение? - PullRequest
2 голосов
/ 22 июня 2010

У меня есть веб-запрос, который создает постоянное (keepalive) подключение к серверу, например ::100100

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 становится истинным через некоторое время. Я бы предположил, что, поскольку это постоянное соединение, поток никогда не закроется?

Есть идеи, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Я думаю, вы путаете сохранение открытого TCP-соединения с открытым потоком ответов. Соединение TCP является базовой средой передачи, тогда как запрос и ответ являются отдельными объектами, передаваемыми через это соединение.

При постоянном соединении вы [в теории] могли бы выдавать несколько пар запрос / ответ по одному соединению. Без постоянного соединения вы по существу открыли бы соединение, выполнили запрос, получили ответ, затем закрыли соединение и затем повторили этот процесс для последующих пар запрос / ответ.

Однако сам ответ имеет конечный размер, как только вы получите завершенный ответ, поток должен закрыться, так как вам больше нечего сказать. Как только вы отправите другой запрос, последует другой ответ; Мне не ясно, будет ли .Net повторно использовать основное постоянное соединение.

1 голос
/ 22 июня 2010

Все, что предполагается сделать, это держать TCP-соединение открытым. Если я правильно читаю, это означает, что вы можете повторно использовать одно и то же физическое TCP-соединение для нескольких запросов к данному серверу. Чего он не сделает, так это оставит ваш поток открытым, чтобы сервер мог отправлять дополнительную информацию.

Если вы действительно хотите потоковую передачу данных, вы должны использовать другой протокол или прямой TCP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...