C#扩展SoapExtension –

背景:我正在尝试编写一个简单的SoapExtension类来记录来自asmx Web服务的入站/出站Soap消息。 在msdn上发表这篇文章之后,我已经能够把事情搞定了。 但是,我真的很想了解它为什么/如何工作,而不仅仅是复制和粘贴代码。

问题:我正在努力掌握的是在示例中处理IO流。 我在网上阅读的所有其他文章都以相同的方式处理流…首先获取对原始流的引用,创建内存“工作”流,然后根据需要交换内容。

第一个问题是,在这种情况下,“流链”是什么意思? 我对流的理解是,写入任何流将自动写入管道中的“内部”流。 如果是这种情况,为什么有必要手动将内容从一个流复制到另一个流?

第二个问题是,在示例复制方法中,他们每次都在创建一个StreamReader和StreamWriter,而不是处理它们 – 这是不是给GC带来了额外的压力? 在高流量的Web服务上看起来不像你想要的东西……我尝试将两者都包含在使用语句中,但是处理读取器/写入器也关闭了流,这导致了更严重的错误。 .NET 4有新的Stream.CopyTo(Stream)方法,但对于.NET 3.5来说,更好的方法是什么?

好吧,通过链接流,您可以基本上拥有不同的流,以链式顺序执行不同的操作。 例如,您可以有一个压缩数据的流,然后是另一个加密数据的流(如果我们正在向另一个方向移动,则相反)。

至于ChainStream本身,嗯…关于这个有很多话要说。 我真的推荐这篇名为Inside of Chainstream的文章,它非常深入,也涵盖了你的大部分问题。

链接在框架中完成。 您将获得原始流并返回放置修改结果的流。 该框架将这个新流链接到任何其他扩展。

它以这种方式实现,因为链接工作“向后”。 通常,您可以在流上添加新function,但在这种情况下,您希望处理输入到原始流中的信息。

在线调用close与Dispose相同。