C# Progressbar sur httpWebResponse

Résolu
Perecastorr Messages postés 39 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 7 septembre 2010 - 25 févr. 2010 à 15:15
Perecastorr Messages postés 39 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 7 septembre 2010 - 26 févr. 2010 à 11:20
Bonjour,

J'ai une jolie classe qui récupère une réponse au format XML d'une httpWebRequest. Sur cette classe j'ai voulu ajouter une gestion de progression dans le but de relier le tout a une progressBar.

Mais je suis confronté a un problème que je ne comprend pas du tout : je ne peux plus réceptionner l'intégralité de mon XML si j'ajoute ma gestion de progression... Je pense qu'il y a quelque chose que j'ai fais de travers, je vous laisse regarder la source :
Ceci est le code de base, qui fonctionne bien :
                if (objHttpWebResponse.StatusCode == HttpStatusCode.OK)
                {
                    //Get response stream
                    objResponseStream = objHttpWebResponse.GetResponseStream();

                    //Load response stream into XMLReader
                    objXMLReader = new XmlTextReader(objResponseStream);
                    
                    //Declare XMLDocument
                    XmlDocument xmldoc = new XmlDocument();
                    xmldoc.Load(objXMLReader);

                    //Set XMLResponse object returned from XMLReader
                    XMLResponse = xmldoc;

                    //Close XMLReader
                    objXMLReader.Close();
                }


Et maintenant le même code mais avec l'ajout de la récupération du nombre d'octet transféré :
//Get response stream
                    objResponseStream = objHttpWebResponse.GetResponseStream();

                    //Load response stream into XMLReader
                    objXMLReader = new XmlTextReader(objResponseStream);

                    Int64 bytesRead;
                    Int64 total = 0;
                    byte[] byteBuffer = new byte[size];
                    do
                    {
                        //Read bytes in stream
                        bytesRead = objResponseStream.Read(byteBuffer, 0, (int)size);
                        //add bytesRead to total
                        total += bytesRead;
                        //Display for future progressBar
                        Console.WriteLine(total/(size/100));
                    }while(bytesRead > 0);

                    //Declare XMLDocument
                    XmlDocument xmldoc = new XmlDocument();
                    xmldoc.Load(objXMLReader);

                    //Set XMLResponse object returned from XMLReader
                    XMLResponse = xmldoc;

                    //Close XMLReader
                    objXMLReader.Close();

J'ai bien l'affichage de la progression en pourcentage en temps réel mais le XmlDocument n'est pas valide, j'ai une exception :
"Unexpected end of file has occurred. The following elements are not closed: "[...]" Line 2, position 3830."


Merci d'avance pour vos éventuelles lumières

1 réponse

Perecastorr Messages postés 39 Date d'inscription lundi 10 novembre 2008 Statut Membre Dernière intervention 7 septembre 2010 1
26 févr. 2010 à 11:20
Bon comme d'habitude... j'ai trouvé la réponse seul :) mais non sans mal

Sa pourrai en intéressé plus d'un :
//Get response stream
                    objResponseStream = objHttpWebResponse.GetResponseStream();


                    
                    Int64 bytesRead;
                    Int64 total = 0;
                    byte[] fileBytes = null;
                    byte[] byteBuffer = new byte[4096];

                    MemoryStream memoryStream = new MemoryStream();
                    //Read bytes in stream
                    do
                    {
                        bytesRead = objResponseStream.Read(byteBuffer, 0, byteBuffer.Length);
                        memoryStream.Write(byteBuffer, 0, (int)bytesRead);
                        //add bytesRead to total
                        total += bytesRead;
                        //Display for future progressBar
                        if (size > 100)
                        {
                            errs.ManageProgress((int)total / ((int)size / 100));
                        }
                    } while (bytesRead > 0);

                    fileBytes = memoryStream.ToArray();

                    string s = Encoding.ASCII.GetString(fileBytes);

                    //Declare XMLDocument
                    XmlDocument xmldoc = new XmlDocument();
                    xmldoc.InnerXml = s;

                    //Set XMLResponse object returned from XMLReader
                    XMLResponse = xmldoc;

                    memoryStream.Close();
3
Rejoignez-nous