从MSMQ

时间:2016-05-17 16:40:01

标签: c# .net serialization msmq

我在这里发现了其他几个有相同问题的帖子,但没有一个提供解决方案。真正奇怪的是,这在dev中起作用,但在prod中起作用。

我正在向队列提交消息,如下所示:

public void QueueMessage(LeadSubmissionMessage message)
    {
        using (var queue = new MessageQueue(MessageQueuePath))
        {
            queue.DefaultPropertiesToSend.Recoverable = true; // always send as recoverable
            queue.Send(message);
        }
    }

这是LeadSubmissionMessage类:

[Serializable]
public class LeadSubmissionMessage
{
    public long LeadId { get; set; }
    public long UserId { get; set; }
    public DateTime DateTime { get; set; }
}

这是消息,原始文本:

<?xml version="1.0"?>
<LeadSubmissionMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <LeadId>194018</LeadId>
  <UserId>300</UserId>
  <DateTime>2016-05-17T14:52:30.1484784Z</DateTime>
</LeadSubmissionMessage>

一切正常。但是在接收端,只有在生产中,当我们这样做时:

body = message.Body;

它抛出了这个错误:

System.InvalidOperationException: Cannot deserialize the message passed as an argument. Cannot recognize the serialization format.
at System.Messaging.XmlMessageFormatter.Read(Message message)
at System.Messaging.Message.get_Body()

它可以在Dev和Staging中找到它。我试图最小化并消除事情可能不同的点,但我已经没有东西可以检查。它们都运行相同的构建版本(发布)。任何与MSMQ相关的配置键都匹配(明显的队列名称和位置除外)。一种可能的变化是机器上安装的MSMQ版本?但我不确定如何检查。操作系统会有所作为吗?无法想象它会。

1 个答案:

答案 0 :(得分:1)

我以下列方式使用它:

private static MyMessage RecieveMessage()
{
    if (!MessageQueue.Exists(QueueName))
    {
        return null;
    }

    using (var msmq = new MessageQueue(QueueName))
    {
        msmq.Formatter = new XmlMessageFormatter(new Type[] { typeof(MyMessage) });
        var message = msmq.Receive();
        return message != null && message.Body is MyMessage ? (MyMessage)message.Body : null;
    }
}

不确定您的问题是什么问题,但您可以尝试将其与我的方法类似,看看它是否适合您。