Question

Je dois traiter chargé à partir ResponseStream sur XML Async progressivement.

Répondre est d'avoir:

  <root>
     <node ...>
        .....
     </node>
     <node />
     ...
  </root>

schéma et les i doivent avoir la capacité de processus <node> avant leur arrivée complète.

Y at-il normalement pour analyser à l'aide de .NET norme?

Était-ce utile?

La solution

System.Xml.XmlTextReader 

« Représente un lecteur qui fournit un accès rapide, non mis en cache, l'accès avant uniquement aux données XML. »

http://msdn.microsoft.com/en -nous / bibliothèque / system.xml.xmltextreader.aspx

Edit: Ceci est un hack rapide, mais il ne démontre que le lecteur est en fait paresseux.

 public class XmlTextReaderTest
    {
        public void RunTest()
        {
            var fs = new XmlTextReader(new Fs(@"c:\TestXml.xml"));
            while (fs.Read())
                File.AppendAllText(@"c:\xLog.txt", "Processing node..." + Environment.NewLine);
        }
    }

    public class Fs : FileStream
    {
        public Fs(string path)
            : base(path, FileMode.Open)
        {

        }

        public override int Read(byte[] array, int offset, int count)
        {
            File.AppendAllText(@"c:\xLog.txt", "Reading from stream..." + Environment.NewLine);
            var ans = base.Read(array, offset, count);
            return ans;
        }
}

Autres conseils

Ne pas appeler sur callbacks async, vous n'avez pas besoin de (confiance moi, cela deviendra plus clair ...).

Le ResponseStream chargera des informations disponibles. Dans le cas d'une petite (pour des valeurs assez grandes de « petite » J'ai peur) ruisseau qui n'est pas envoyé morcelées ce sera lorsque le flux entier a été téléchargé. Toutefois, si le flux est envoyé avec un codage de transfert Chunked (ce qui est ce qui se passe dans ASP.NET si mise en mémoire tampon est désactivé ou Response.Flush() est appelé, d'autres technologies serveur web ont leurs équivalents), le flux sera disponible au premier morceau .

Créez votre XMLReader de ResponseStream lorsque le GetResponse () est de retour. Il va commencer le traitement à partir du premier morceau étant disponible, et d'obtenir des morceaux suivants car ils arrivent en toute transparence à votre code.

Assurez-vous que votre traitement de ces nœuds sur une base comme-disponible bénéficie effectivement du code sur la même ligne. Par exemple. si vous émettre vers console ou une forme, faire que chaque noeud est traité (ou un petit lot de noeuds), alors que si vous êtes en train de créer des objets à partir de ces nœuds, les yield return alors plutôt que la construction d'une collection.

Maintenant, la grande chose est ici clairement la question de savoir si le flux web est morcelées, plutôt que votre code de traitement. Si le producteur est une autre partie qui ne peut pas être persuadé de faire cela, alors vous devrez descendre à un niveau plus bas dans votre traitement. Toutefois, si tel est le cas faire alors il en est tout à fait probable une fausse optimisation que le traitement tout sera fait à leur fin avant d'envoyer le premier octet, et qui est le plus gros retard était sera. Vraiment, si le délai pour obtenir le fichier téléchargé de réponse entière est un problème pour votre code, vous besoin eux pour commencer à envoyer chunked comme le retard même avec l'approche la plus efficace de votre part sera toujours trop grande .

Pour mémoire, je l'ai tout récemment confirmé que dans une telle utilisation de XmlReader sur un trafic de WebResponse avec des données chunked (où je contrôle à la fois le code client et le serveur, et pourrait avoir à la fois en cours d'exécution dans un débogueur et vérifier la ordre de fonctionnement), le traitement est en effet fait que chaque bloc est disponible.

Oui, il y a un lecteur que vous pouvez utiliser. Basicaly va le long d'un cours d'eau ADND lance n événement pour chaque élément, il identifie (élément, attribut, etc.).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top