Как прочитать сообщение MSMQ из приложения VB6 с помощью кода .NET? - PullRequest
1 голос
/ 06 ноября 2008

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

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

Как мне успешно читать эти сообщения, используя код .Net?

Ответы [ 4 ]

2 голосов
/ 14 ноября 2008

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

Сериализует или десериализует примитив типы данных и другие объекты или из тела очереди сообщений сообщение, используя формат, который совместим с MSMQ ActiveX Компонент

При отправке с vb6 вы используете интерфейс msmq com. Что является еще одним названием для интерфейса ActiveX. После вы получите строку с ActiveXMessageFormatter. Конвертируйте его в объект XML явно.

0 голосов
/ 02 июля 2015

Я только что провел целый день, борясь с сообщениями, которые помещаются и читаются из 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!

0 голосов
/ 16 ноября 2010

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

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

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

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

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

0 голосов
/ 07 ноября 2008

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

...