2011-03-25 61 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相同。