2008-11-06 8 views

Répondre

0

d'abord inspecter vos données pour s'assurer qu'il est vraiment comme le message d'erreur implique. Si c'est le cas, lisez d'abord les données sous forme de texte ou binaire, supprimez le '.', Puis utilisez le xmlmessageformatter

2

Je crois que vous devez utiliser le format ActiveXMessageFormatter, et non XmlMessageFormatter. XmlMessageFormatter permet d'envoyer des objets entre des applications .net. Ce que vous envoyez n'est pas xml mais une chaîne. Et pas une chaîne .net. Selon la documentation du ActiveXMessageFormatter est pour:

Serializes or deserializes primitive data types and other objects to or from the body of a Message Queuing message, using a format that is compatible with the MSMQ ActiveX Component

Lorsque vous envoyez de VB6 vous utilisez l'interface com MSMQ. Quel est un autre nom pour l'interface ActiveX. Après avoir reçu la chaîne avec le ActiveXMessageFormatter. Convertissez-le en objet XML explicitement.

0

J'ai de mauvaises nouvelles. J'ai suivi le conseil fourni et cela n'a pas fonctionné. J'ai éventuellement fini par créer un objet COM VC++ qui afficherait les messages dans la file d'attente à partir de mon application .NET, juste pour que le récepteur COM VC++ de l'autre côté puisse comprendre le message.

Je suppose que vous devrez créer un objet COM VB6 que vous appelez depuis l'application .NET pour envoyer les messages.

Il semble que le mqao.dll que les objets COM utilisent, utilise un formateur différent de celui de .NET et même celui d'ActiveX ne fonctionne pas.

De toute évidence, cela implique également deux files d'attente, une pour les applications COM héritées et une pour les applications .NET. Donc, vous enverriez le même message deux fois, une fois pour chaque client cible.

0

Je viens de passer toute la journée à traiter des messages qui sont lus et lus à partir d'un MSMQ par un formateur caché sous tellement de couches d'abstraction et de config que j'ai désespéré de trouver dans cette vie. J'ai construit la fonction suivante comme une attaque de force brute sur tout message MSMQ qui semble contenir au moins un peu d'ASCII lisible:

private static string MsmqMsgBodyWtf(Message recalcitrantMsmqMessage, bool showHex = false, bool showChars = false) 
    { 
     recalcitrantMsmqMessage.Formatter = new ActiveXMessageFormatter(); 
     byte[] bytes = (byte[])recalcitrantMsmqMessage.Formatter.Read(recalcitrantMsmqMessage); 
     StringBuilder dottedHex = new StringBuilder(); 
     StringBuilder dottedAscii = new StringBuilder(); 
     StringBuilder plainAscii = new StringBuilder(); 

     for (int i = 0; i < bytes.Length; i++) 
     { 
      byte b = bytes[i]; 

      string hexString; 
      hexString = String.Format("{0:x2}", b); 
      dottedHex.Append(hexString + "."); 

      string charString = byte2char(b); 
      string escapedCharString = (b > 31 && b < 128) ? charString : "?"; 
      dottedAscii.Append(escapedCharString + " ."); 
      plainAscii.Append(escapedCharString); 
     } 

     StringBuilder composedOutput = new StringBuilder(plainAscii.ToString()); 
     if (showHex || showChars) composedOutput.Append(System.Environment.NewLine); 
     if (showHex) composedOutput.AppendLine(dottedHex.ToString()); 
     if (showChars) composedOutput.AppendLine(dottedAscii.ToString()); 

     return composedOutput.ToString(); ; 
    } 

Maintenant je peux vider les messages sur quelque part et de les analyser à l'aide d'autres outils. Hourra!

Questions connexes