流作为 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请求

如何在PHP中传递SOAP标头和Body作为参数

在 SOAP 请求中将 XML 数据作为参数传递

WebService发布协议--SOAP和REST的区别

传递 SOAP req:传递 ItemNo String 但它无法找到在 NAV 2018 中作为 Web 服务公开的 Codeunit

http,soap and rest