如何阅读msmq消息(我,不是电脑)

时间:2010-06-02 22:26:28

标签: msmq

我想查看我的队列,msm控制台snapin有这个属性对话框,但是很难阅读,对我来说很重要的消息被编码,看起来像这样:

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 个答案:

答案 0 :(得分:5)

答案 1 :(得分:2)

试试这个:

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      
}

答案 2 :(得分:2)

我在寻找这个问题的答案时发现了这两种方法,但实际上它们完美无缺。

    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编码格式的更详细讨论。

答案 3 :(得分:0)

如果您只有一些十六进制数据可以轻松转换为ASCII并返回,那么我建议您使用文本编辑器。 UltraEdit有一个“视图十六进制”函数,可以将十进制视图转换为十六进制视图。您也可以尝试使用Notepad ++,但我不知道它是否具有该功能。

答案 4 :(得分:0)

您还可以从https://msmq-studio.com

查看MSMQ Studio

答案 5 :(得分:0)

您可以使用Service Bus MQ Manager,它是我为在MSMQ中查看消息而编写的免费开源工具,它支持XML和JSON消息的着色和格式化。

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