2008-11-06 3 views
1

Я пишу простую строку XML с MSMQ из приложения VB6, но когда я пытаюсь прочитать сообщение из очереди в C# с помощью XmlMessageFormatter я получаю следующее сообщение об ошибке:Как читать сообщение MSMQ из приложения VB6 с помощью .NET-кода?

«Имя не может начинаться с ' «. символ "

Как я могу успешно прочитать эти сообщения с помощью .Net-кода?

ответ

0

Сначала проверьте свои данные, чтобы убедиться, что это действительно так, как следует из сообщения об ошибке. Если это так, сначала прочтите данные как текстовые или двоичные, удалите оскорбительные «.», Затем используйте xmlmessageformatter

2

Я считаю, что вам нужно использовать ActiveXMessageFormatter, а не XmlMessageFormatter. XmlMessageFormatter предназначен для отправки объектов между приложениями .net. То, что вы отправляете, это не xml, а строка. И не строка .net. Согласно документации ActiveXMessageFormatter это для:

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

При отправке из VB6 вы используете MSMQ ком интерфейс. Это другое имя для интерфейса ActiveX. После получения строки с помощью ActiveXMessageFormatter. Преобразовать его в объект xml явно.

0

У меня плохие новости. Я следил за предоставленными советами, и это не сработало.

В итоге я создал объект VC++ COM, который отправил сообщения в очередь из моего .NET-приложения, так что ресивер VC++ COM с другой стороны мог понять сообщение.

Я подозреваю, что вам нужно будет создать объект COM VB6, который вы вызываете из приложения .NET, для отправки сообщений.

Кажется, mqao.dll, что COM-объекты используют, использует другой форматтер, чем .NET, и даже ActiveX не работает.

Очевидно, что это подразумевает две очереди, одну для устаревших приложений COM и одну для приложений .NET. Таким образом, вы отправляете одно и то же сообщение дважды, один раз для каждого целевого клиента.

0

Я только что провел весь день, борясь с сообщениями, которые помещаются и читаются из MSMQ с помощью форматировщиков, которые скрыты под таким количеством абстракций и конфигураций слоев, которые я отчаялся найти в этой жизни. Я построил следующую функцию в качестве грубой силы атаки на любое сообщение MSMQ, что, кажется, содержит, по крайней мере, немного читаемом ASCII:

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

Теперь я могу сбросить сообщения где-то и анализировать их с помощью других инструментов. Yippee!

 Смежные вопросы

  • Нет связанных вопросов^_^