流作为 SOAP 响应传递
Posted
技术标签:
【中文标题】流作为 SOAP 响应传递【英文标题】:Stream being passed as SOAP response 【发布时间】:2012-02-29 20:47:39 【问题描述】:我有一个 SOAP 响应,它将其主体元素作为 ...stream... 传回,我被告知这意味着正在传递一个流。我将如何阅读此流?我怎样才能知道它是什么流?接收流的程序是 WCF 服务。
【问题讨论】:
@talnicolas 根据我的经验,StreamReader 对于读取任意流实际上并不是很有用... @MarcGravell 哦,好吧,这只是一个提示,我真的不懂任何 C#。 您能详细介绍一下客户端和服务器吗? WCF 可以非常透明地传递流。 【参考方案1】:流通常只能读取一次,因此如果您读取流,它可能会被消耗,您需要重新创建它。您可以这样做的一个可能的地方是自定义消息编码器,它包装了原始绑定编码器。
您需要实现两个WriteMessage
方法。在缓冲的情况下,只需将调用委托给包装的编码器,您就可以获得消息内容。在流式传输的情况下,您将写入消息,将内存流传递给封装的编码器,检查内容,然后将流内容写入作为参数传递的流。
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
ArraySegment<byte> result = this.wrappedEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);
// message contents on the array segment.
return result;
public override void WriteMessage(Message message, Stream stream)
MemoryStream ms = new MemoryStream();
this.wrappedEncoder.WriteMessage(message, ms);
// message contents in the memory stream
ms.Position = 0;
ms.CopyTo(stream);
【讨论】:
谢谢。我在 Web.config 中将 transferMode 从 Streamed 切换为 Buffered,现在我可以在日志中看到正文以上是关于流作为 SOAP 响应传递的主要内容,如果未能解决你的问题,请参考以下文章
传递 SOAP req:传递 ItemNo String 但它无法找到在 NAV 2018 中作为 Web 服务公开的 Codeunit