2009-06-02 6 views
5

Ho bisogno di comunicare con un'applicazione legacy dalla mia app C# tramite la Coda messaggi di Windows.Come posso interrompere il mio System.Messaging.MessageQueue dal wrapping delle stringhe in XML?

L'applicazione legacy prevede i messaggi di stringa normale in una particolare coda privata, ma non riesco a fermare System.Messaging.MessageQueue dal wrapping del mio messaggio in XML!

Il codice Sono test è molto semplice:

MessageQueue myQueue = new MessageQueue(@".\Private$\tolegacy"); 
Message msg = new Message("My Test String"); 
myQueue.Send(msg); 

Il guaio è che il messaggio viene serializzato XML e appare in coda come:

<?xml version="1.0"?><string>My Test String</string> 

non posso modificare il comportamento dell'applicazione legacy, quindi ho bisogno di interrompere System.Messaging.MessageQueue dalla formattazione del mio messaggio come XML.

Qualcuno può aiutare?

risposta

3

È possibile creare il proprio formattatore (si tratta di una classe che implementa IMessageFormatter e assegnare alla proprietà Formatter del Messaggio

Ecco un link a MSDN alla proprietà Message.Formatter.

I non ho provato questo, ma dovresti essere in grado di scrivere il tuo messaggio usando BodyStream, credo che bypasserà il formattatore

+0

Scrivere direttamente su BodyStream ha funzionato, grazie. Sembrava il cambiamento più semplice, quindi l'ho provato prima :) – Damovisa

+0

Ne ho scritti diversi io e funzionano davvero bene. L'unica cosa di cui devi preoccuparti è il mittente e il ricevitore che capiscono il tipo di corpo. –

+0

Stiamo riscontrando un problema simile. Siamo in grado di leggere/scrivere in coda e recuperare il messaggio. Ma quando il venditore legge la coda, vede la "roba" in più avvolta attorno al nostro messaggio. Come possiamo semplicemente scrivere una semplice stringa senza alcun involucro? Anche BinaryFormatter ha aggiunto un mucchio di byte all'inizio della stringa. – NealWalters

3

Utilizzare lo ActiveXMessageFormatter ti darà il risultato desiderato.Avevamo lo stesso problema con il semplice voler passare un stringa a una coda e fa in modo che il listener proces s leggere nel corpo come una stringa. Il ActiveXMessageFormatter viene utilizzato per serializzare/deserializzare i tipi di dati primitivi e non inserirà un wrapper XML come input con il valore predefinito XmlMessageFormatter.

mq.Formatter = new ActiveXMessageFormatter(); 

Here è un altro collegamento che descrive i 3 formattatori differenti pure.