C# WCF:此消息无法支持该操作,因为它已被复制
我参考了stackoverflow的一些链接: 及 从第一个链接来看,消息似乎不能复制多次。从第二个链接来看,如果我们重新创建消息,消息似乎可以被复制多次 有人能指出我所犯的错误吗。由于此方法被多次调用,我收到以下错误:“此消息无法支持此操作,因为它已被复制” 异常:System.InvalidOperationException:此消息无法支持该操作,因为它已被复制。\r\n在System.ServiceModel.Channel.message.CreateBufferedCopy(Int32 maxBufferSize)尝试以下代码:C# WCF:此消息无法支持该操作,因为它已被复制,c#,wcf,C#,Wcf,我参考了stackoverflow的一些链接: 及 从第一个链接来看,消息似乎不能复制多次。从第二个链接来看,如果我们重新创建消息,消息似乎可以被复制多次 有人能指出我所犯的错误吗。由于此方法被多次调用,我收到以下错误:“此消息无法支持此操作,因为它已被复制” 异常:System.InvalidOperationException:此消息无法支持该操作,因为它已被复制。\r\n在System.ServiceModel.Channel.message.CreateBufferedCopy(Int
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();
}
}
如原文所述
消息变量通过引用和
包含WCF将使用的消息。它不可能处于“已经”状态
读取“对于WCF使用有效的状态”。不过,你可以打电话
多次使用buffer.CreateMessage()创建实际
消息WCF正在使用。如果你想把什么东西注入
现有邮件,您可以从旧邮件创建新邮件
并将修改后的消息传递回WCF
试试这个,它对我有用
MessageBuffer buffer = message.CreateBufferedCopy(Int32.MaxValue);
message = buffer.CreateMessage();
var copy = buffer.CreateMessage();
我想这是因为您正在调用buffer.createMessage();两次。为什么不改为使用message=messageCopy?使用stacktrace更新了我的问题:异常:System.InvalidOperationException:此消息无法支持此操作,因为它已被复制。\r\n位于System.ServiceModel.Channels.message.CreateBufferedCopy(Int32 maxBufferSize)。它与同一消息上的CreateBufferedCopy多次相关,这与我在上面问题的代码中所做的不一样吗?问题是它不能多次调用CreateBufferedCopy。此外,错误显示“此消息无法支持该操作,因为它已被复制”。我可以多次阅读此消息,但这不是问题您{正在以另一种方式执行此操作您正在调用copy=message.createbuffer而不是message=buffer.createMessage()我想可能是这样。在调试过程中,我还意识到有两个并发线程试图调用同一个方法,因为消息作为引用传递,所以导致了问题。我猜你也读了我链接的答案了吗?看起来这和你的问题是一样的。是的,我读了你发布的答案这里提到的问题是,它被多次读取。对我来说,它被多次复制。另外,在我的代码中,你在哪里看到我在复制=message.createbuffer
var bufferedMessage = message.CreateBufferedCopy(int.MaxValue);
using (var messageToRead = bufferedMessage.CreateMessage())
{
//Code Block
messageToRead.Close();
}
message = bufferedMessage.CreateMessage();