【问题标题】:C# extending SoapExtension -C# 扩展 SoapExtension -
【发布时间】:2011-03-25 16:02:38
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# soap stream asmx soap-extension


    【解决方案1】:

    嗯,通过链接流,您基本上可以让不同的流按链接顺序执行不同的操作。例如,您可以有一个压缩数据的流,然后有另一个加密数据的流(或者如果我们朝另一个方向移动,则相反)。

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

    【讨论】:

    【解决方案2】:

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

    以这种方式实现是因为链接“向后”工作。通常,您在流之上添加新功能,但在这种情况下,您希望处理馈送到原始流中的信息。

    在流上调用 close 与 Dispose 相同。

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2010-12-05
      相关资源
      最近更新 更多