2010-06-22 9 views
2

J'ai un WebRequest qui CREATEST une connexion persistante (keepalive) au serveur, par exemple .:Pourquoi j'obtiens l'endOfStream dans un webrequest, s'il s'agit d'une connexion persistante (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} 

Je me demande pourquoi responseStream.EndOfStream devient vrai après un certain temps. J'aurais supposé que parce que c'est une connexion persistante, le flux ne serait jamais fermer?

Des idées pour lesquelles cela se passe?

Répondre

2

Je pense que vous confondez en gardant la connexion TCP ouverte en gardant le flux de réponse ouvert. La connexion TCP est le support de transmission sous-jacent, tandis que la requête et la réponse sont des entités individuelles communiquées via cette connexion.

Avec une connexion permanente vous [en théorie] pourriez émettre plusieurs paires de requête/réponse sur la même connexion. Sans connexion permanente, vous devez essentiellement ouvrir la connexion, émettre la demande, recevoir la réponse, puis fermer la connexion, puis répéter ce processus pour les paires de requêtes/réponses suivantes. La réponse elle-même est cependant de taille finie, une fois que vous avez reçu la réponse complète, le flux devrait se fermer car il n'y a plus rien à vous dire. Une fois que vous émettez une autre demande, une autre réponse suit; Je ne sais pas si .Net réutilisera la connexion persistante sous-jacente.

+0

Cela a du sens, alors disons que je veux garder une connexion ouverte à un serveur web pendant quelques heures (avec données en streaming tout le temps), comment pourrais-je accomplir cela? – rksprst

+0

Basé sur votre question ici et à l'autre réponse, je pense que vous comprenez mal les concepts de streaming et de persistance de la connexion. Indépendamment des types de connexion, HTTP est une conversation de demande/réponse. Vous allez toujours émettre une requête finie, et le serveur vous donnera toujours une réponse finie, ce qui implique qu'il y a une fin à cette réponse. Ce que vous cherchez, si je comprends bien (et corrigez-moi si je me trompe), est essentiellement une façon d'avoir une seule variable de réponse et de pouvoir l'utiliser encore et encore. Tu ne pourras pas faire ça. – CodingGorilla

+0

Ce que j'essaie de faire est de me connecter à l'API Streaming de Twitter (http://dev.twitter.com/pages/streaming_api) Dans la section "Connexion", ils ont un texte qui implique que vous devriez être capable de le faire dans afin de se connecter à l'API de streaming via HTTP. Si je ne peux pas garder un flux de réponse ouvert via HTTP, alors je ne comprends pas comment Twitter aimerait que nous maintenions la connexion? Ou, ai-je encore mal compris quelque chose? – rksprst

1

Tout ce qui est supposé faire est de garder la connexion TCP ouverte. Si je lis ceci correctement, cela signifie que vous pouvez réutiliser la même connexion TCP physique pour plusieurs requêtes à un serveur donné. Ce qu'il ne fera pas, c'est garder votre flux ouvert afin que le serveur puisse envoyer des informations supplémentaires.

Si vous voulez vraiment diffuser des données, vous devez utiliser un protocole différent ou TCP direct.

+0

Connaissez-vous des exemples de diffusion complète de données? – rksprst

+0

Fondamentalement, n'importe quel exemple sur TCP le fera, mais voici un point de départ décent. http://www.codeproject.com/KB/IP/socketsincsharp.aspx –

+0

Je l'utilise pour Twitter Streaming API (http://dev.twitter.com/pages/streaming_api), juste regardé leurs documents et ils veulent une connexion HTTP. Est-il possible de rendre le flux de lecture persistant avec une connexion HTTP? J'ai juste essayé d'obtenir le flux de réponse à nouveau, mais il semblerait que ne fonctionnera que si une nouvelle connexion est faite. – rksprst