2011-03-25 108 views
9

背景: 我想寫一個簡單的SoapExtension類來記錄來自asmx web服務的入站/出站Soap消息。按照this article on msdn,我已經能夠使事情工作。不過,我真的很想知道爲什麼/它是如何工作的,而不是複製粘貼代碼&。C#擴展SoapExtension -

問題: 我特別要抓的是處理IO流的例子。我在網上閱讀的所有其他文章都以相同的方式處理流...首先獲取對原始流的引用,創建內存「工作」流,然後根據需要交換內容。

第一個問題是,在這種情況下,「流鏈」是什麼意思?我對流的解釋是,寫入任何流將自動寫入流水線中的「內部」流。如果是這種情況,爲什麼需要手動將內容從一個流複製到另一個流?

第二個問題是,在示例Copy方法中,他們每次都創建StreamReader和StreamWriter,而不處理它們 - 這不會給GC帶來額外的壓力嗎?似乎沒有你想要的高流量的Web服務...我試圖包裝在使用語句,但處置讀寫器也封閉了流導致更嚴重的錯誤。 .NET 4有新的Stream.CopyTo(Stream)方法,但是對於.NET 3.5來說更好的方法是什麼?

回答

3

好吧,通過鏈接流,你可以基本上有不同的流,以鏈接的順序做不同的事情。例如,可以有一個壓縮數據的流,然後是另一個流加密數據(或者如果我們正在向另一個方向移動,則是相反的)。

至於ChainStream本身,那麼...有很多事情要說這個。我真的推薦這篇名爲Inside of Chainstream的文章,它非常深入,也涵蓋了大部分的問題。

+0

+1爲偉大的鏈接! – MattDavey 2011-04-01 12:26:37

+1

鏈接已死。這是互聯網檔案連結:https://web.archive.org/web/20131027132243/http://hyperthink.net/blog/inside-of-chainstream/ – cbeuker 2015-12-30 17:55:41

2

鏈接在框架中完成。您將獲得原始流並返回放置修改後結果的流。該框架將把這個新流連接到任何其他擴展。

它以這種方式實現,因爲鏈接工作「向後」。通常情況下,您會在流上添加新功能,但在這種情況下,您希望處理饋送到原始流中的信息。

在流上調用close與Dispose相同。