Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF:此消息无法支持该操作,因为它已被复制_C#_Wcf - Fatal编程技术网

C# WCF:此消息无法支持该操作,因为它已被复制

C# WCF:此消息无法支持该操作,因为它已被复制,c#,wcf,C#,Wcf,我参考了stackoverflow的一些链接: 及 从第一个链接来看,消息似乎不能复制多次。从第二个链接来看,如果我们重新创建消息,消息似乎可以被复制多次 有人能指出我所犯的错误吗。由于此方法被多次调用,我收到以下错误:“此消息无法支持此操作,因为它已被复制” 异常:System.InvalidOperationException:此消息无法支持该操作,因为它已被复制。\r\n在System.ServiceModel.Channel.message.CreateBufferedCopy(Int

我参考了stackoverflow的一些链接:

从第一个链接来看,消息似乎不能复制多次。从第二个链接来看,如果我们重新创建消息,消息似乎可以被复制多次

有人能指出我所犯的错误吗。由于此方法被多次调用,我收到以下错误:“此消息无法支持此操作,因为它已被复制”

异常:System.InvalidOperationException:此消息无法支持该操作,因为它已被复制。\r\n在System.ServiceModel.Channel.message.CreateBufferedCopy(Int32 maxBufferSize)

尝试以下代码:

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