Toute façon que je puisse connaître la longueur du flux de réponses afin que je puisse montrer à l'utilisateur un pourcentage d'avancement du téléchargement au lieu d'un indéterminé? P>
Je trouve que la réponse ressemble à celle ci-dessous, non propre et sans longueur p>
p>
3 Réponses :
Essayez d'utiliser la propriété webresponse.contentlength code>. Si les retours -1, cela signifie que le serveur distant ne vous envoie pas la longueur du corps de réponse, et vous ne pouvez donc pas déterminer la longueur de la réponse sans le lire dans son intégralité. P>
J'ai fait un test dans PHP où je définissais la longueur du contenu ( code sur Pastebin ), je ne sais pas si je l'ai fait Droite, et j'ai toujours eu un ruisseau désigné ... hmm ... je vais essayer un vrai téléchargement, peut-être de download.com plus tard ...
Le flux webresponse.getroesponsestream code> n'est pas recherché. C'est un flux en lecture seule seulement. Mais l'en-tête CODE> ContentLength code>, si défini, est généralement fiable. Vous ne devriez pas avoir à chercher.
Petit addition: retourné est en octets b>! Src: docs.microsoft. COM / EN-US / DOTNET / API / ...
Hé bien oui? Les objets de flux représentent un flux d'octets, donc j'ai supposé que c'était assez évident.
Si vous êtes intéressé, j'ai une bibliothèque de référence de code qui inclut une classe WebHelper. Il est similaire à la classe WebClient (y compris la capacité de signaler des progrès), mais est plus flexible. Il est stocké sur CodePlex, le nom du projet est bizark . p>
Il utilise la propriété de réponse.ContenTlength pour déterminer la longueur de la réponse. P>
La propriété ContentLength est simplement envoyée dans le cadre de l'en-tête du serveur. Il existe des situations où le serveur peut ne pas connaître la longueur de la réponse avant d'envoyer l'en-tête. Par exemple, si vous téléchargez une page Web générée dynamiquement avec le tampon éteint sur le serveur. P>
J'ai résolu la création d'une classe d'emballage nommée WebStreamwithlenght (la méthode de recherche n'est pas implémentée car je n'en ai pas besoin)
Vous devez l'utiliser comme ceci P>
WebRequest req = HttpWebRequest.Create(link); WebResponse res = req.GetResponse(); var stream = res.GetResponseStream(); var streamWithLenght = new WebStreamWithLenght(stream, res.ContentLength); public class WebStreamWithLenght : Stream { long _Lenght; Stream _Stream; long _Position; public WebStreamWithLenght(Stream stream, long lenght) { _Stream = stream; _Lenght = lenght; } public override bool CanRead { get { return _Stream.CanRead; } } public override bool CanSeek { get { return true; } } public override bool CanWrite { get { return _Stream.CanWrite; } } public override void Flush() { _Stream.Flush(); } public override long Length { get { return _Lenght; } } public override long Position { get; set; } public override int Read(byte[] buffer, int offset, int count) { var result = _Stream.Read(buffer, offset, count); Position += count; return result; } public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); } public override void SetLength(long value) { _Lenght = value; } public override void Write(byte[] buffer, int offset, int count) { Write(buffer, offset, count); } }
Pourquoi les bowvotes? Est-ce que quelqu'un veut expliquer pourquoi ce n'est pas une bonne réponse?