Как читать сообщения msmq (я, а не компьютер) - PullRequest
9 голосов
/ 03 июня 2010

Я хочу заглянуть внутрь своих очередей, оснастка консоли msm имеет это диалоговое окно свойств, но его очень сложно прочитать, а важные для меня сообщения закодированы и выглядят так:

3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 20 65 6E 63 6F .0" enco
64 69 6E 67 3D 22 75 74 ding="ut
66 2D 38 22 3F 3E 0D 0A f-8"?>..
3C 65 73 62 3A 6D 65 73 <esb:mes
73 61 67 65 73 20 78 6D sages xm
6C 6E 73 3A 65 73 62 3D lns:esb=
22 68 74 74 70 3A 2F 2F "http://
73 65 72 76 69 63 65 62 serviceb
75 73 2E 68 69 62 65 72 us.hiber
6E 61 74 69 6E 67 72 68 natingrh

...

Кто-нибудь знает инструмент, который позволил бы мне просматривать мои сообщения в удобной для разработчиков форме? Инструмент для упрощенного администрирования очередей пригодится (например, выбор нескольких сообщений и перетаскивание их)

Ответы [ 6 ]

5 голосов
/ 03 июня 2010

Это лучший инструмент, который я нашел: http://www.cogin.com/msmq/QueueExplorer/QueueExplorer2.2.php

2 голосов
/ 23 февраля 2013

Я нашел эти два метода во время поиска ответа на этот вопрос, и они на самом деле работали отлично.

    public System.Xml.XmlDocument ConvertToXMLDoc(System.Messaging.Message msg)
    {
        byte[] buffer = new byte[msg.BodyStream.Length];
        msg.BodyStream.Read(buffer, 0, (int)msg.BodyStream.Length);
        int envelopeStart = FindEnvolopeStart(buffer);
        System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer, envelopeStart, buffer.Length - envelopeStart);
        System.ServiceModel.Channels.BinaryMessageEncodingBindingElement elm = new System.ServiceModel.Channels.BinaryMessageEncodingBindingElement();
        System.ServiceModel.Channels.Message msg1 = elm.CreateMessageEncoderFactory().Encoder.ReadMessage(stream, Int32.MaxValue);
        System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
        doc.Load(msg1.GetReaderAtBodyContents());
        msg.BodyStream.Position = 0;
        return doc;
    }

    private int FindEnvolopeStart(byte[] stream)
    {
        int i = 0;
        byte prevByte = stream[i];
        byte curByte = (byte)0;
        for (i = 0; i < stream.Length; i++)            
        {
            curByte = stream[i];
            if (curByte == (byte)0x02 &&
            prevByte == (byte)0x56)
                break;
            prevByte = curByte;
        }
        return i - 1;
    }

Просто вызовите функцию ConvertToXmlDoc, предоставив сообщение из очереди сообщений, и вы получите XmlDocument обратно. Я ленивый, поэтому я просто помещаю innerXml в файл, чтобы я мог его прочитать.

    MessageQueue queue = new MessageQueue(queueName);
    var msg = queue.Receive();
    var doc = ConvertToXMLDoc(msg);                
    using (var sw = new StreamWriter(@"C:\message.txt")))
           sw.Write(doc.InnerXml);

Нет приложения для покупки, и вы вернете свои данные в код, так что вы можете возиться с ним.

PS: Кредит, если кредит подлежит оплате. Фрагмент взят из http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c03d80cd-492c-4ece-8890-6a35b12352e0, который также ссылается на более подробное обсуждение формата кодировки MSMQ.

2 голосов
/ 15 февраля 2011

Попробуйте это:

string QueueName = @".\private$\publishingQueue"; 

//note, you cannot use method exists on remote queues

if (MessageQueue.Exists(QueueName))
{ 
    var queue = new MessageQueue(queueInfo.QueueName)
    {
        MessageReadPropertyFilter = new MessagePropertyFilter
        {
            ArrivedTime = true,
            Body = true
        }
    };

    var messages = queue.GetAllMessages();
    var m = messages[0];
    m.Formatter = new System.Messaging.XmlMessageFormatter(new String[] {});

    StreamReader sr = new StreamReader(m.BodyStream);

    string ms = "";
    string line;

    while (sr.Peek() >= 0) 
    {
        ms += sr.ReadLine();
    }

    //ms now contains the message      
}
0 голосов
/ 06 апреля 2013

Вы можете использовать Service Bus MQ Manager, его бесплатный инструмент с открытым исходным кодом, который я написал для просмотра сообщений в MSMQ, он поддерживает раскраску и форматирование сообщений XML и JSON.

http://blog.halan.se/page/Service-Bus-MQ-Manager.aspx

0 голосов
/ 04 июня 2010

Вы также можете проверить MSMQ Studio по https://msmq -studio.com

0 голосов
/ 03 июня 2010

Если у вас есть только шестнадцатеричные данные, которые можно легко преобразовать в ASCII и обратно, я предлагаю текстовый редактор, который позволит вам сделать это. UltraEdit имеет функцию просмотра шестнадцатеричного представления, которая работает для преобразования в шестнадцатеричное представление и из него. Вы также можете попробовать Notepad ++, но я не знаю, имеет ли он эту функцию.

...