4

上的所有方法System.ServiceModel.Channels.Message只允许您读取一次消息正文,如果在读取消息后调用,则会失败并抛出异常。msdn 文档确认只能读取消息正文之一。但是,如果您调用ToString()已阅读的消息,您似乎会取回整个肥皂信封、正文和所有内容。

因此,在我的情况下,如果只有方法允许,即使在读取正文之后似乎也可以访问正文。

我在这里缺少什么吗?在某些情况下,是否ToString()作为一种变通方法使身体不可靠?

就我而言,我正在为一些 WCF 操作进行一些错误日志记录,并从OperationContext.RequestContext.RequestMessage. 我正在记录消息,ToString()因为这是我能找到的允许我记录消息正文的唯一方法。

4

3 回答 3

8

ToString可能会打印消息正文,但这不能保证。有许多类型的Message对象(它是一个抽象类)。其中一些缓冲整个正文,而另一些则只有一个仅向前的阅读器。缓冲消息的消息实现可能会在调用时写入正文ToString,这就是您所看到的。但这并不保证适用于所有消息类型。在许多情况下,主体在被调用时被简单地写为“...stream...” ToString

于 2012-08-16T02:01:40.647 回答
2

只是想分享一下我已经message.toString成功使用该方法的目的是保留从 a 派生的 base64 编码字符串,该字符串byte[]在创建消息缓冲区时丢失(缓冲区是复制原始消息的唯一方法,所以我的代码中需要它)。在创建缓冲区、使用它制作 XML 并编辑 XML 之后,我使用从该toString方法保存的字符串恢复了 base64 字符串。我不建议这样做,但在这种情况下它确实是唯一的选择,我知道它可以在我的特定代码中工作。也就是说,我通常认为这应该是最后的选择。

于 2014-07-18T21:20:26.740 回答
0

您应该创建消息副本然后阅读。例如:

using (MessageBuffer messageBuffer = message.CreateBufferedCopy(Int32.MaxValue))
{
    Message restoredMessage = messageBuffer.CreateMessage();
    message = messageBuffer.CreateMessage();
    return MessageToString(ref restoredMessage);
}

RequestContext.RequestMessage 在一种方式调用中不存在,因此ToString无法正常工作,另一种方式RequestMessage.ToString()将以字符串形式返回消息内容

于 2012-08-15T20:22:04.163 回答