La lecture de “chunked” réponse avec HttpWebResponse
Je vais avoir de la difficulté à lire un "chunked" réponse lors de l'utilisation d'un StreamReader pour lire le flux renvoyé par GetResponseStream() d'un HttpWebResponse:
//response is an HttpWebResponse
StreamReader reader = new StreamReader(response.GetResponseStream());
string output = reader.ReadToEnd(); //throws exception...
Lorsque le reader.ReadToEnd()
méthode est appelée, je reçois le Système suivant.IO.IOException: Impossible de lire les données de la connexion de transport: La connexion a été fermée.
Le code ci-dessus fonctionne très bien lorsque le serveur renvoie un "non-chunked" réponse.
La seule façon que j'ai été en mesure de l'obtenir pour fonctionner est de l'utilisation de HTTP/1.0 pour la demande initiale (au lieu de HTTP/1.1, la valeur par défaut), mais cela semble comme une lame de travailler autour de.
Des idées?
@Chuck
Votre solution fonctionne assez bien. Ça en jette toujours la même IOExeception sur la dernière Lecture(). Mais après avoir inspecté le contenu de la classe StringBuilder elle ressemble à toutes les données ont été reçues. Alors peut-être que j'ai juste besoin d'envelopper le Lire() dans un try-catch et avaler le "erreur".
Je vais voir ce comportement .NET 4.6 connexion à la PowerDNS 3.4.5 HTTP API REST. Les solutions de contournement n'aident pas. Si j'avale l'exception, je perds une partie de la réponse.
OriginalL'auteur Craig | 2008-08-19
Vous devez vous connecter pour publier un commentaire.
N'ai pas essayé avec un "chunked", mais la réponse serait quelque chose comme ce travail?
Vous ne pouvez pas utiliser des caractères ASCII, vous avez besoin de comprendre à quel encodage est utilisé, par exemple de Type de Contenu, et ensuite l'utiliser pour "GetString"
OriginalL'auteur
Je suis en train de travailler sur un problème similaire. L' .net HttpWebRequest et HttpWebRequest gérer les cookies et redirige automatiquement, mais ils ne gèrent pas chunked content sur le corps de la réponse automatiquement.
C'est peut-être parce que les fragments de contenu peut contenir plus de données simples (c'est à dire: segmenter les noms, suivi des en-têtes).
Il suffit de lire le flux, et en ignorant les expressions du FOLKLORE exception ne fonctionnera pas tant que le flux de données contient plus que le contenu souhaité. Le flux contient des morceaux, et chaque morceau commence par déclarer sa taille. Si le flux est simplement la lire du début à la fin de la finale de données contiendra la partie méta-données (et dans le cas où il est gziped contenu ce sera un échec de la vérification CRC lors de la décompression).
Pour résoudre le problème, il est nécessaire d'analyser manuellement les flux, de la suppression de la taille de segment de chaque morceau (ainsi que la CR LF délimiteurs), la détection de la finale du morceau et de ne garder que le bloc de données. Il est la probabilité d'une bibliothèque là, quelque part qui fait cela, je n'ai pas encore trouvé.
Utile des ressources :
http://en.wikipedia.org/wiki/Chunked_transfer_encoding
http://tools.ietf.org/html/rfc2616#section-3.6.1
OriginalL'auteur
Craig, sans voir le flux que vous êtes en train de lire c'est un peu difficile à déboguer mais PEUT-être que vous pouvez changer le paramètre de la variable count:
C'est un peu un hack, mais si la dernière lecture est de vous tuer et ce n'est pas le retour des données puis théoriquement, cela permettra d'éviter le problème. Je me demande encore pourquoi le flux est en train de faire.
OriginalL'auteur
J'ai eu le même problème (qui est de savoir comment je me suis retrouvé ici :-). Finalement, le suivi qu'il est descendu sur le fait que les fragments de flux n'était pas valide - la finale de longueur zéro morceau manquait. Je suis venu avec le code suivant qui gère à la fois valides et non valides chunked ruisseaux.
OriginalL'auteur