首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何读取msmq消息(我,而不是pc)

如何读取msmq消息(我,而不是pc)
EN

Stack Overflow用户
提问于 2010-06-03 06:26:28
回答 6查看 9.5K关注 0票数 11

我想看看我的队列内部,msm控制台管理单元有这个属性对话框,但它很难读取,对我来说很重要的消息是这样编码的:

代码语言:javascript
复制
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

..。

谁知道有什么工具可以让我以一种对开发人员友好的方式来查看我的消息?一个更容易管理队列的工具会很方便(比如选择多个消息并拖放它们)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-03 06:28:10

这是我找到的最好的工具:http://www.cogin.com/msmq/QueueExplorer/QueueExplorer2.2.php

票数 5
EN

Stack Overflow用户

发布于 2011-02-15 21:47:35

试试这个:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-02-23 04:06:22

我在寻找这个问题的答案时发现了这两种方法,它们实际上工作得很好。

代码语言:javascript
复制
    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放到一个文件中,这样我就可以读取它了。

代码语言:javascript
复制
    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);

无需购买应用程序,您就可以在代码中重新获得数据,这样您就可以随意处理它了。

附言:值得表扬的地方。该代码片段来自http://social.msdn.microsoft.com/forums/en-US/wcf/thread/c03d80cd-492c-4ece-8890-6a35b12352e0,它还链接到有关MSMQ编码格式的更详细讨论。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2962073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档