从ASMX迁移到WCF时SoapExtension.ChainStream的替代方法

时间:2014-03-12 02:05:52

标签: web-services wcf

我正在将客户端从使用ASMX代理升级到WCF。需要注意的是,我无法控制服务器端实现或接口。 这个过程相当简单,但是,在ASMX中,我们使用SoapExtension直接访问网络流。我做过一些研究,但似乎并不是一个简单的方法来使用WCF。一种选择可能是编写自定义传输通道,但这似乎是相当多的工作,以实现相当简单的事情。 还有其他想法吗?

更新:为了响应我为什么需要直接写入网络流: 很长的故事。我将尝试简要解释一下。 我正在使用具有MTOM界面的服务器来上传文件。我无法控制服务器或其源代码。不幸的是,生成的WCF代理使用字节数组作为文件内容。这是大文件的问题,因为整个文件必须加载到内存中,特别是在32位进程和LOH碎片中,我很快得到一个OutOfMemoryException,文件只有几百个MB。 以前使用ASMX代理时,我想出了一个聪明的技巧来解决这个问题: 我没有将文件的内容直接写入byte []属性,而是编写源文件的路径。然后我在通过网络流发送消息之前拦截消息,并用文件内容替换此路径,这次只读取并以块的形式发送数据。 这只有在我有权访问网络流时才有可能。否则,尝试以这种方式操纵消息只会将整个文件加载到内存中,这正是我试图避免的。

1 个答案:

答案 0 :(得分:0)

我认为你应该可以通过使用IClientMessageInspector来做类似的事情。

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector(v=vs.110).aspx

它使您可以在发送和接收时访问原始消息。