WCF:此消息不支持该操作,因为它已被复制

时间:2015-12-09 21:23:49

标签: c# wcf

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)

2 个答案:

答案 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();