C # erweitert SoapExtension -

9

Hintergrund: Ich versuche, eine einfache SoapExtension-Klasse zu schreiben, um eingehende / ausgehende Soap-Nachrichten von einem asmx-Webdienst zu protokollieren. Folgender dieser Artikel auf msdn , Ich konnte Dinge zum Laufen bringen. Allerdings würde ich gerne verstehen, warum / wie es funktioniert und nicht nur kopieren & amp; Einfügen von Code.

Die Frage: Was ich gerade im Griff habe, ist die Handhabung der IO-Streams im Beispiel. Alle anderen Artikel, die ich im Web gelesen habe, behandeln die Streams auf identische Weise. Zuerst erhalten sie einen Verweis auf den ursprünglichen Stream, erstellen einen Arbeitsspeicher im Arbeitsspeicher und tauschen dann den Inhalt nach Bedarf aus.

Die erste Frage ist, was ist mit "Stream Chaining" in diesem Zusammenhang gemeint? Mein Understaning von Streams ist, dass das Schreiben in einen Stream automatisch in die "inneren" Streams in einer Pipeline schreibt. Wenn das der Fall ist, warum ist es notwendig, Inhalte manuell von einem Stream zu einem anderen zu kopieren?

Die zweite Frage ist, dass sie in den Copy-Methoden jedes Mal einen StreamReader und einen StreamWriter erstellen, ohne sie zu entsorgen - bringt das nicht zusätzlichen Druck auf den GC? Es scheint nicht so, als würdest du etwas von einem Webdienst mit hohem Datenaufkommen wollen ... Ich habe versucht, beide Anweisungen zu verwenden, aber durch das Löschen des Readers / Writers wurde auch der Stream geschlossen, was zu ernsteren Fehlern führte. .NET 4 hat neue Stream.CopyTo (Stream) -Methoden, aber was wäre ein besserer Ansatz für .NET 3.5?

    
MattDavey 25.03.2011, 16:02
quelle

2 Antworten

3

Nun, durch das Verketten von Streams können Sie grundsätzlich verschiedene Streams haben, die verschiedene Dinge in einer verketteten Reihenfolge tun. Zum Beispiel können Sie einen Stream haben, der die Daten komprimiert, und dann einen anderen Stream, der die Daten verschlüsselt (oder das Gegenteil, wenn wir uns in die andere Richtung bewegen).

Wie für ChainStream selbst, naja ... Es gibt viele Dinge zu sagen über diese. Ich empfehle diesen Artikel wirklich Inside of Chainstream Das ist sehr eingehend und deckt auch die meisten Fragen ab, die Sie haben.

    
Andreas Johansson 28.03.2011, 10:27
quelle
2

Die Verkettung erfolgt im Rahmen. Sie erhalten den ursprünglichen Stream und geben den Stream zurück, an den Sie das geänderte Ergebnis übergeben haben. Das Framework kettet diesen neuen Stream in andere Erweiterungen.

Es ist so implementiert, weil die Verkettung "rückwärts" funktioniert. Normalerweise fügen Sie neue Funktionen zu Streams hinzu, aber in diesem Fall möchten Sie mit den Informationen arbeiten, die in den ursprünglichen Stream eingegeben wurden.

Das Aufrufen von "Schließen bei Stream" ist identisch mit "Dispose".

    
adrianm 28.03.2011 12:29
quelle

Tags und Links