【发布时间】:2014-11-05 15:41:54
【问题描述】:
我的新工作项目要求我了解 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。我相信我正在正确阅读消息,所以我认为我一定是错误地插入了它们。插入是如此简单,以至于我不确定如何以不同的方式进行。根据this question/answer,对于有符号整数,我应该得到 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。它是一个非事务性队列,没有身份验证或安全性。
【问题讨论】:
-
BodyType 69 - VT_STORED_OBJECT - 用于a persistent serialized object whose format is the output of a call to OleSave using IPersistStorage.,这可能不是你想要的。
-
我正在编写一个管理仪表板来观察各种 MSMQ。我希望能够不请求正文,但至少在查询远程服务器时对正文包含的内容有所了解。我知道它不会告诉我关于存储什么类型的对象的任何信息,但我希望计算有多少对象以及字符串、整数和二进制文件。目前,无论我插入什么,MSMQ 总是指示它是一个字节[]。
-
可能是格式化程序设置的,你试过没有吗?
-
是的。在相同的输出中没有格式化结果。
标签: msmq