C# Can';从MSMQ读取时对消息.Body进行反序列化
我在这里看到过其他几个帖子也有同样的问题,但没有一个能提供解决方案。真正奇怪的是,这在dev中有效,但在prod中无效 我正在向队列提交一条消息,如下所示:C# Can';从MSMQ读取时对消息.Body进行反序列化,c#,.net,serialization,msmq,C#,.net,Serialization,Msmq,我在这里看到过其他几个帖子也有同样的问题,但没有一个能提供解决方案。真正奇怪的是,这在dev中有效,但在prod中无效 我正在向队列提交一条消息,如下所示: public void QueueMessage(LeadSubmissionMessage message) { using (var queue = new MessageQueue(MessageQueuePath)) { queue.DefaultPropertiesT
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>
它抛出以下错误:
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版本?但我不知道该怎么检查。操作系统会有所不同吗?无法想象它会这样。我用以下方式使用它:
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;
}
}
不确定您的问题出在哪里,但您可以尝试与我的方法类似,看看它是否适合您。我假设正文是HTML消息的一部分。因此,消息的html部分存在问题。可能是cookie或代理服务器问题。首先,我会使用类似fiddler的嗅探器来查看传输失败的地方。比较好的结果和坏的结果,并检查http头的差异。Message.Body不是HTML消息的一部分。这是LeadSubmissionMessage的一个实例。(OP中的类代码)在这种情况下,Fiddler不会有帮助。您能确定它是队列中唯一的消息吗?此外,发送方定义的类型与接收方定义的类型之间是否存在任何不匹配?同一队列用于各种类型的消息,同一流程提取所有消息,然后根据类型将其交给处理程序。真正奇怪的是,这在Dev和Staging中有效,但在prod中失败。我想我要重新推到prod的新版本。这是我所能想到的。凯西:这是通过windows操作系统传递的隧道消息吗?
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;
}
}