2009-06-02 4 views
5

Je dois communiquer avec une application héritée de mon application C# via la file d'attente Windows Message.Comment arrêter mon System.Messaging.MessageQueue d'encapsuler mes chaînes en XML?

L'application héritée attend des messages de chaîne normale dans une file d'attente privée particulière, mais je n'arrive pas à empêcher le System.Messaging.MessageQueue d'encapsuler mon message en XML!

Le code que je suis le test est très simple:

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

Le problème est que le message est XML sérialisé et apparaît dans la file d'attente:

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

Je ne peux pas modifier le comportement de l'application héritée, donc j'ai besoin d'arrêter le System.Messaging.MessageQueue de formater mon message en XML.

Quelqu'un peut-il aider?

Répondre

3

Vous pouvez créer votre propre formatter (il est une classe qui implémente IMessageFormatter et l'affecter à la propriété Formatter du message

Voici un link à MSDN à la propriété Message.Formatter.

I Je n'ai pas essayé cela, mais vous devriez être en mesure d'écrire votre message en utilisant le BodyStream, je crois que cela va contourner le formateur

+0

Écriture directement sur le BodyStream travaillé, merci. Cela ressemblait au changement le plus facile, donc je l'ai essayé en premier :) – Damovisa

+0

J'ai écrit plusieurs moi-même et ils fonctionnent très bien. La seule chose dont vous avez à vous soucier est l'expéditeur et le receveur qui comprend le type de corps. –

+0

Nous avons un problème similaire. Nous pouvons lire/écrire dans la file d'attente et récupérer le message correctement. Mais quand le vendeur lit la file d'attente, il voit le "truc" supplémentaire enroulé autour de notre message. Comment pouvons-nous simplement écrire une chaîne simple sans aucun emballage? Même BinaryFormatter a ajouté un tas d'octets au début de la chaîne. – NealWalters

3

L'utilisation du ActiveXMessageFormatter vous donnera le résultat souhaité Nous avons eu le même problème avec juste vouloir passer un chaîne à une file d'attente et avoir le processus auditeur s lire dans le corps comme une chaîne. Le ActiveXMessageFormatter est utilisé pour la sérialisation/désérialisation des types de données primitifs et ne mettra pas un wrapper XML sur votre entrée comme c'est le cas avec la valeur par défaut XmlMessageFormatter.

mq.Formatter = new ActiveXMessageFormatter(); 

Here est un autre lien décrivant les 3 différents formatteurs ainsi.

Questions connexes