我向本地计算机上的MSMQ队列发送了一些完全相同的消息(显然除了Id#)。消息正文是一个序列化的XElement对象。
当我尝试处理队列中的第一条消息时,我能够成功反序列化Message.Body对象并将其保存到文件中。但是,在尝试处理下一个(或任何后续)消息时,Message.Body不存在,并抛出异常。我已经验证了消息ID对于尝试处理的消息是正确的。
正在序列化的XML正确形成。
有什么想法吗?我的代码基于此处的Microsoft MSMQ Book订购示例:http://msdn.microsoft.com/en-us/library/ms180970%28VS.80%29.aspx
// Create Envelope XML object
XElement envelope = new XElement( env + "Envelope"
, new XAttribute( XNamespace.Xmlns + "env"
, env.NamespaceName )
<snip>
//Send envelope as message body
MessageQueue myQueue = new MessageQueue(
String.Format(@"FORMATNAME:DIRECT=OS:localhost\private$\mqsample")
);
myQueue.DefaultPropertiesToSend.Recoverable = true;
// Prepare message
Message myMessage = new Message();
myMessage.ResponseQueue = new MessageQueue(
String.Format(System.Globalization.CultureInfo.InvariantCulture,
@"FORMATNAME:DIRECT=TCP:192.168.1.217\private$\mqdemoAck")
);
myMessage.Body = envelope;
// Send the message into the queue.
myQueue.Send(myMessage,"message label");
//Retrieve messages from queue
System.Messaging.Message message = mqOrderQueue.Receive();
我在第一次检索时看到的Message.Body值是预期的:<?xml version="1.0" encoding="utf-8"?>
<string>Some String</string>
但是,第二次和后续检索操作Message.Body是:“无法反序列化作为参数传递的消息。无法识别序列化格式“。
第一次如何正常工作,但之后却没有?我在检索它之后尝试过message.Dispose()但它没有帮助。
非常感谢您对此的任何帮助!
答案 0 :(得分:0)
如果您收到第一条消息,然后加载管理控制台以查看队列,您可以在属性对话框中看到这些消息的主体,这可能表明您实际上从未实际为它们保留正文。可能?
我在MSMQ上通过ID接收没有任何问题,虽然我知道在分布式事务下的某些高负载情况下,它确实有一两个错误导致线程卡住等待。
然后再次通过ID接收排除了队列的位置,所以我从未使用过那么多:D
答案 1 :(得分:0)
也许第二个主体不包含XML前导码,因为一个对象仍然存在,认为它已经写了它?换句话说,您可能有某些状态需要在某处清理。
我建议按照kprobst的建议查看控制台中的消息。
答案 2 :(得分:0)
我能够通过创建一个新对象来解决这个问题,并将我的序列化“信封”指定为新对象内部的对象(而不是直接将我的“信封”分配给Message.Body。
//Class to create new message object
public class MsgToDB
{
public int someInteger;
public DateTime timeStamp;
public XElement payload;
}
// Create an object of class MsgToDB which will contain envelope object
MsgToDB testMsgObj = new MsgToDB();
testMsgObj.someInteger = 3;
testMsgObj.timeStamp = DateTime.Now;
testMsgObj.payload = envelope;
// Create and send message
Message testMsg = new Message(testMsgObj);
myQueue.Send(testMsg, "message label");
谢谢大家的有用建议。