2017-02-22 99 views
1

当我试图从MSMQ获取消息时,我得到了一些stange结果 - 它看起来像消息已损坏。当我尝试将其解析回对象时,我只是得到了xml异常。MSMQ消息无法解析到对象

这是我想要做的。

我从Web服务使用此代码

MessageQueue queue = new MessageQueue(ConfigurationManager.AppSettings["receiptQueue"]); 
      { 
       queue.Formatter = new XmlMessageFormatter(new[] { typeof(Receipt) }); 
       Message msg = new Message(); 
       Receipt obj = new Receipt(); 
       obj.AlertId = alertId; 
       obj.UserName = userName; 
       obj.Version = version; 
       obj.PC = pcName; 
       msg.Body = obj; 
       queue.Send(msg); 
      } 

我使用的收据对象是看起来像这样

public class Receipt 
{ 
    public Receipt() 
    { 
    } 
    public int AlertId { get; set; } 
    public int Version { get; set; } 
    public string UserName { get; set; } 
    public string PC { get; set; } 
} 

在Windows服务我试图写入MSMQ从队列中获取对象。

初始化队列

MessageQueue receiptQueue = new MessageQueue(ConfigurationManager.AppSettings["receiptQueue"]); 
     receiptQueue.Formatter = new XmlMessageFormatter(new[] { typeof(Receipt) }); 
     receiptQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(ReceiptReceiver); 
     receiptQueue.BeginReceive(); 

处理消息

private void ReceiptReceiver(object source, ReceiveCompletedEventArgs asyncResult) 
    { 
     Receipt receptObj = new Receipt(); 
     MessageQueue mq = (MessageQueue)source; 
     Message mes =mq.EndReceive(asyncResult.AsyncResult);   
     try 
     {  
      receptObj = (Receipt)mes.Body; //error happens here 
      //Do logic 
     } 
     } 
     catch (Exception ex) 
     { 
      // ex handeling 
     } 
     mq.BeginReceive(); 
    } 

我得到mq.EndReceive后消息以下信息

Message object

它然后去那里捉例外是“根元素缺失”

这是来自队列的消息。它看起来格式不错。

<?xml version="1.0"?> 
<Receipt xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <AlertId>500</AlertId> 
    <Version>2</Version> 
    <UserName>jk9c</UserName> 
    <PC>aasudv211</PC> 
</Receipt> 

对我在做什么有什么建议吗?

/Birger

+0

MSMQ中的消息是什么?如果您手边有按摩,那么您的MSMQ序列化或反序列化就不会出错。 – klashar

+0

我已经从队列中添加了一条消息。它看起来格式不错 – Birger

回答

1

找到了错误..这是一个非常简单而且非常愚蠢的错误。 我将队列分配给代码中其他位置的格式错误。

所以我不得不

receiptQueue.Formatter = new XmlMessageFormatter(new[] { typeof(Receipt) }); 

receiptQueue.Formatter = new XmlMessageFormatter(new[] { typeof(AlertMessage) }); 

之后我删除的最后都运作良好。