Windows消息队列总是插入BodyType为0?

时间:2014-09-11 15:39:54

标签: msmq

我的新工作项目要求我了解MSMQ。我目前正试图弄清楚如何解析邮件的Body。问题是,我输入的每条消息都有BodyType 0。我的计算机上只有一个公共队列,我用这个C#填充测试数据

using System;
using System.Messaging;

namespace Sandbox {
    class Program {
        static void Main(string[] args) {
            MessageQueue q = MessageQueue.GetPublicQueuesByMachine(Environment.MachineName)[0];

            q.Purge();

            Person me = new Person();
            me.Name = "Corey Ogburn";
            me.Number = 25;

            q.Formatter = new XmlMessageFormatter(new Type[] { typeof(int), typeof(String), typeof(Person) });

            q.Send(1);
            q.Send("One");

            q.Send(2);
            q.Send("Two");

            q.Send(3);
            q.Send("Three");

            q.Send(me);

            Console.WriteLine();
            Console.WriteLine("DONE");
            Console.ReadKey(true);
        }
    }
}

一切顺利,在计算机管理中,我可以看到7条消息在那里,我可以查看它们的主体并验证它们是否正确进入(作为XML条目)。

但是,当我去阅读这些消息时,所有消息都BodyType 0

public void AllMessages(String server, String queue) {
    MessageQueueCriteria crit = new MessageQueueCriteria();
    crit.MachineName = server;
    crit.Label = queue;
    using (MessageQueueEnumerator e = MessageQueue.GetMessageQueueEnumerator(crit)) {
        if (e.MoveNext()) {
            e.Current.MessageReadPropertyFilter = new MessagePropertyFilter();
            e.Current.MessageReadPropertyFilter.SetAll();
            foreach (Message m in e.Current.GetAllMessages()) {
                // Here, m.BodyType is always 0
            }
        }
        e.Close();
    }
}

我一直在阅读this field should be set for me。我相信我正确地阅读了消息,所以我认为我必须错误地插入它们。插入是如此简单,我不知道如何以不同的方式做到这一点。根据{{​​3}},我应该为已签名的int获取3的BodyTypes,为我的字符串获取30或31,为我的对象获得68或69。至少,如果MSMQ只将它们视为字符串,那么它们应该都是30或31.我无法解释为什么我会得到0.我该怎么做才能将这些数字正确设置为BodyType ?

编辑:似乎即使我在存储消息时设置了BodyType,当我去阅读它时它仍然是0。添加此代码:

Message msg = new Message();
msg.Body = me;
msg.BodyType = 69;
q.Send(msg);

它将我的自定义对象添加到队列中,但该消息看起来与之前的q.Send(me)完全相同。

我认为Windows 7是MSMQ 4.它是一个非事务性队列,没有身份验证或安全性。

1 个答案:

答案 0 :(得分:0)

您也可以使用BinaryMessageFormatter。无论你是在阅读/写作,最好设置格式化程序,所以你100%确定你可以在两端进行序列化。

您也可以右键点击“我的电脑”' >管理>服务和应用>消息队列

在那里,您将能够看到消息的正文,并仔细检查您的逻辑。