C# MSMQ 无效操作异常

Posted

技术标签:

【中文标题】C# MSMQ 无效操作异常【英文标题】:C# MSMQ Invalid Operation Exception 【发布时间】:2015-05-06 16:59:19 【问题描述】:

我创建了一个基本的应用程序来用 C# 管理 MSMQ。

我使用这种方法在我的事务消息队列中创建消息:

/// <summary>
/// Method to send message in message queue
/// </summary>
/// <param name="mq">message queue (to)</param>
/// <param name="messageBody">message body</param>
/// <param name="messageLabel">message label</param>
public static void sendMessage(MessageQueue mq, string messageBody, string messageLabel)

      MessageQueueTransaction mqt = new MessageQueueTransaction();
      try
      
            Message m = new Message(messageBody, new XmlMessageFormatter(new String[]  "System.String,mscorlib" ));
            m.BodyType = 0;
            mqt.Begin();
            mq.Send(m, messageLabel, mqt);
            mqt.Commit();
       
       catch (Exception ex)
       
            string s = ex.Message;
            mqt.Abort();
       
       finally
       
            mq.Close();
       

对于消息处理(在控制台中写入内容消息),我使用这个:

/// <summary>
/// Get all messages in MSMQ
/// </summary>
/// <param name="mq"> MSMQ </param>
public static void getMessage(MessageQueue mq)

     Message[] messages = mq.GetAllMessages();
     try
     
           foreach (Message m in messages)
           

                Console.WriteLine("Message" + m.Label = ": " + m.Body.ToString());
           
     
     catch (Exception ex)
     

            Console.WriteLine(ex.Message);
     

所有消息都在消息数组中,但我在 foreach 语句的行中有一个无效操作异常。 当我使用调试器时,我可以看到很多消息属性都有异常。 我只是想确保我在消息中发送标签和正文以便稍后获取。 send 或 get 方法是否有错误(或两者都有)? --谢谢

【问题讨论】:

请为您的问题找到一个更有意义的标题! 【参考方案1】:

问题是您在发送时应用了自定义消息格式化程序,但在接收时没有。如果您进一步调查该异常,您可能会在内部异常中看到更多详细信息,例如:“找不到能够读取此消息的格式化程序。”

修复很简单。只需在接收队列上设置相同的格式化程序即可:

queue.Formatter = new XmlMessageFormatter( new String[] "System.String,mscorlib" );

此外,您也可以将其用于发送队列。如果您发送多条消息,最好在队列中指定一次,而不是单独为每条消息指定一次(如果它始终相同)。

【讨论】:

以上是关于C# MSMQ 无效操作异常的主要内容,如果未能解决你的问题,请参考以下文章

C# 的无效强制转换异常

C#问题,异常:线程间操作无效: 从不是创建控件“textbox2”的线程访问它。

C#发送邮件异常:根据验证过程,远程证书无效

无法加载计数器名称数据,因为索引无效 - 异常

Protobuf-net 使用嵌套数据反序列化时出现无效的线型异常(C++ 到 C#)

C#中无效的Resx文件。