How to read msmq messages (me, not the pc)
Asked Answered
L

6

12

I want to look inside my queues, the msm console snapin has this property dialog, but it is very difficult to read and the messages which are important to me are encoded and look like this:

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

...

Anyone knows of a tool that would allow me to see my messages in a bit developer friendly way? A tool for easier administering queues would come handy to (like selecting multiple messages and drag and drop them)

Lao answered 2/6, 2010 at 22:26 Comment(0)
F
5

This is about the best tool I've found: http://www.cogin.com/msmq/QueueExplorer/QueueExplorer2.2.php

Fresnel answered 2/6, 2010 at 22:28 Comment(4)
Hm, looks nice - but I can only see my Journal sub queue - you think this is because I am not a registered user?Lao
I don't have the trial version, but in my full version I can explore all queues, including remote queues.Fresnel
they have now a new beta which understands sub queues. I am using this so far. A bit buggy (well, beta), but a quite useful tool. I wonder why MS couldn't come up with anything better.Lao
Looks awesome at a first glance, way better than Computer Management utility in Windows. +1Dreadfully
A
2

Try this:

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      
}
Alltime answered 15/2, 2011 at 13:47 Comment(0)
T
2

I found these two methods while searching for an answer to this question and they actually worked perfectly.

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

Simply call the ConvertToXmlDoc function, providing the message from the message queue and you'll get an XmlDocument back. I am lazy, so I just drop the innerXml into a file so I can read it.

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

No application to buy and you get your data back in code so you can mess around with it.

PS: Credit where credit is due. The snippet came from http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c03d80cd-492c-4ece-8890-6a35b12352e0 , which also links to a more detailed discussion of MSMQ's encoding format.

Traceetracer answered 22/2, 2013 at 20:6 Comment(0)
S
0

If you just have some hexadecimal data that can easily be converted to ASCII and back, then I suggest a text editor that lets you do just that. UltraEdit has a "view hex" function that works to convert both to and from hexadecimal view. You might also try Notepad++ but I don't know if it has that feature.

Specie answered 2/6, 2010 at 22:28 Comment(2)
The property dialog only shows the first n rows and the text decoded besides. I doubt I could do anything with those.Lao
Oh right, I didn't realize you didn't have access to more data.Specie
O
0

You could also check out MSMQ Studio from https://msmq-studio.com

Ostend answered 3/6, 2010 at 20:49 Comment(0)
E
0

You can use Service Bus MQ Manager, its a free open-source tool I wrote for viewing messages in MSMQ, it supports coloring and formatting of XML and JSON messages.

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

Esthonia answered 6/4, 2013 at 10:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.