2017-02-22 2 views
1

Ich habe einige stange Ergebnis beim Versuch, Nachrichten von einem MSMQ erhalten - es sieht aus wie die Nachricht ist beschädigt. Ich erhalte nur XML-Ausnahmen, wenn ich versuche, es zu einem Objekt zurück zu analysieren.MSMQ-Nachricht kann nicht analysiert werden, um Objekt

Hier ist, was ich versuche zu tun.

Ich bin von einem Webservice zu einem MSMQ Schreiben mit diesem Code

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); 
      } 

Die Quittung Objekt ich benutze ist wie dies Ich versuche

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; } 
} 

In einem Windows-Dienst sieht um das Objekt aus der Warteschlange zu bekommen.

Init Warteschlange

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

die Nachricht Griff

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(); 
    } 

ich die folgenden Informationen für die Nachricht nach mq.EndReceive erhalten

Message object

Es geht dann zu fangen, wo die Ausnahme ist "Root-Element fehlt"

Dies ist eine Nachricht aus der Warteschlange. Es sieht ziemlich gut formatiert aus.

<?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> 

Irgendwelche Vorschläge zu was ich falsch mache?

/Birger

+0

Was ist die Nachricht in Ihrem MSMQ? Wenn Sie eine Massage auf der Hand haben, würden Sie nicht falsch Serialisierung oder Deserialisierung Ihrer MSMQ. – klashar

+0

Ich habe eine Nachricht aus der Warteschlange hinzugefügt .. Es sieht gut formatiert aus – Birger

Antwort

1

Fand den Fehler .. Es war eine sehr einfache und sehr dummen Fehler. Ich habe die Warteschlange einem falschen Formatierer an einer anderen Stelle im Code zugewiesen.

So hatte ich

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

und

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

Nachdem ich die letzt alle gut funktionieren entfernt.

Verwandte Themen