MSMQ第一个Message.Body在队列中是OK,队列中的所有Message.Body都是空的

时间:2010-05-14 18:07:05

标签: c# xml xml-serialization msmq

我向本地计算机上的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()但它没有帮助。

非常感谢您对此的任何帮助!

3 个答案:

答案 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");

谢谢大家的有用建议。