我的新工作项目要求我了解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.它是一个非事务性队列,没有身份验证或安全性。
答案 0 :(得分:0)
您也可以使用BinaryMessageFormatter。无论你是在阅读/写作,最好设置格式化程序,所以你100%确定你可以在两端进行序列化。
您也可以右键点击“我的电脑”' >管理>服务和应用>消息队列
在那里,您将能够看到消息的正文,并仔细检查您的逻辑。