【问题标题】:Windows message queue always inserts with a BodyType of 0?Windows 消息队列总是插入 BodyType 为 0?
【发布时间】:2014-11-05 15:41:54
【问题描述】:

我的新工作项目要求我了解 MSMQ。我目前正在尝试弄清楚如何解析消息的Body。问题是,我输入的每条消息都有一个BodyType0。我的计算机上只有一个公共队列,我用这个 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 条目)。

但是,当我阅读这些消息时,它们都有BodyType0

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


【解决方案1】:

您也可以使用 BinaryMessageFormatter。无论如何,无论您是在读/写,最好设置格式化程序,这样您就可以 100% 确定您可以在两端进行反序列化/序列化。

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

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

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2012-04-17
    相关资源
    最近更新 更多