private static string ReadDefaultMessageBody(ref Message message)
{
const string XmlReaderName = "binary";
if (message.IsEmpty)
{
return string.Empty;
}
MessageBuffer buffer = message.CreateBufferedCopy(int.MaxValue);
try
{
// Copy the original message and use it for reading.
Message messageCopy = buffer.CreateMessage();
// Re-create original message
message = buffer.CreateMessage();
// Dump payload from original message
// It is in either plain text or in base64 encoded string
using (var reader = messageCopy.GetReaderAtBodyContents())
{
return string.Compare(reader.Name, XmlReaderName, StringComparison.OrdinalIgnoreCase) == 0
? Encoding.Default.GetString(Convert.FromBase64String(reader.ReadInnerXml()))
: reader.ReadOuterXml();
}
}
finally
{
buffer.Close();
}
}
我在stackoverflow上引用了一些链接:This message cannot support the operation because it has been copied
和
MessageInspector message: "This message cannot support the operation because it has been copied."
从第一个链接看,消息不能被复制多次。从第二个链接看,如果我们重新创建消息,则可以多次复制消息。
有人能指出我正在做的错误。由于此方法被多次调用,我得到以下错误:“此消息不支持该操作,因为它已被复制”
异常:System.InvalidOperationException:此消息不支持该操作,因为它已被复制。\ r \ n在System.ServiceModel.Channels.Message.CreateBufferedCopy(Int32 maxBufferSize)
答案 0 :(得分:3)
试试这段代码:
r1->child = r;
正如原answer
所述消息变量通过引用传递到您的代码中 包含WCF将使用的消息。它已经不能存在了 读"状态对WCF使用有效。但是,你可以打电话 buffer.CreateMessage()多次创建实际的克隆 消息WCF正在使用。如果你想注入一些东西 现有消息,您可以从旧消息创建新消息 并将修改后的消息传递回WCF
答案 1 :(得分:0)
试试这个,它对我有用
var bufferedMessage = message.CreateBufferedCopy(int.MaxValue);
using (var messageToRead = bufferedMessage.CreateMessage())
{
//Code Block
messageToRead.Close();
}
message = bufferedMessage.CreateMessage();