Frage

ich brauche von ResponseStream auf Async Rückrufe XML progressiv geladen zu verarbeiten.

Reply ist haben:

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

Schema, und ich brauche die Fähigkeit Prozess <node> haben, bevor sie ankommen abgeschlossen.

Gibt es normale Art und Weise es mit Standard-.NET zu analysieren?

War es hilfreich?

Lösung

System.Xml.XmlTextReader 

„Stellt einen Leser, die eine schnelle, nicht-zwischengespeichert, Vorwärtszugriff auf XML-Daten zur Verfügung stellt.“

http://msdn.microsoft.com/en -US / library / system.xml.xmltextreader.aspx

Edit: Dies ist eine schnelle Hack, aber es funktioniert zeigen, dass der Leser in der Tat faul ist.

 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;
        }
}

Andere Tipps

nennen es nicht auf asynchroner Rückrufe, brauchen Sie nicht zu (Vertrauen Sie mir, das wird klarer, ...).

Die Response wird als Information laden verfügbar ist. Im Fall eines kleinen (für sehr große Werte von „kleinen“ Ich habe Angst) Strom, der nicht gesendet wird chunked dies sein wird, wenn der gesamte Strom heruntergeladen wurde. Jedoch, wenn der Strom mit einer segmentierte Übertragungscodierung gesendet wird (dies ist, was passiert, wenn in ASP.NET Pufferung ausgeschaltet oder Response.Flush() heißt, andere Web-Server-Technologien haben ihre Äquivalente), dann wird der Strom an den ersten chunk Verfügung .

Erstellen Sie Ihre XMLReader von Response wenn die GetResponse () zurückgegeben hat. Es wird die Verarbeitung von der ersten Brocken starten zur Verfügung stehen, und nachfolgende Stücke zu erhalten, wie sie ganz transparent, um Ihren Code gelangen.

Stellen Sie sicher, dass Ihr Umgang mit diesen Knoten auf einer als verfügbare Basis tatsächlich den Code zugute kommt weiter in der Zeile. Z.B. wenn Sie auf Konsole oder eine Form ausgeben, tun, um jeden Knoten (oder eine kleine Charge von Knoten) verarbeitet wird, während, wenn Sie Objekte aus diesem Knoten erstellen, yield return sie dann eher als eine Sammlung aufzubauen.

Nun, hier die große Sache ist eindeutig die Frage, ob der Webstream gestückelt, anstatt Ihr Verarbeitungscode. Wenn der Hersteller eine andere Partei, die nicht überzeugt werden können, dies zu tun, dann müssen Sie auf ein niedrigeres Niveau in der Verarbeitung fallen zu lassen. Allerdings, wenn dies der Fall ist dann so tut, ist sehr wahrscheinlich eine falsche Optimierung wie die gesamte Verarbeitung wird an ihrem Ende durchgeführt werden, bevor sie das erste Byte senden, und das ist war die größte Verzögerung sein wird. Wirklich, wenn die Verzögerung die gesamte Antwort heruntergeladene zu bekommen, ist ein Problem für den Code, dann sind Sie auf Notwendigkeit , um sie als Verzögerungs chunked mit sogar dem effizienteste Ansatz zu senden beginnen auf Ihrer Seite immer noch zu groß sein .

Für das Protokoll habe ich erst vor kurzem bestätigt, dass in einer solchen Verwendung von XmlReader auf einem WebResponse Umgang mit chunked Daten (wo ich sowohl gesteuert, um die Client- und Server-Code, und könnte in einem Debugger beide laufen haben und überprüfen Sie auf der Reihenfolge der Operation), wird die Verarbeitung in der Tat getan als jeder Chunk zur Verfügung.

Ja, es ist ein Leser, dass Sie verwenden können. Grundsätzlich geht entlang einem Strom und wirft ein Ereignis für jedes Element identifiziert sie (Element, Attribut etc.).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top