Очередь сообщений Windows всегда вставляется с BodyType 0?

Мой новый проект на работе требует, чтобы я знал о 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();
    }
}

Я продолжаю читать, что это поле должно быть установлено для меня. Я полагаю, что правильно читаю Сообщения, поэтому я думаю, что я вставляю их неправильно. Вставка настолько проста, что я не уверен, как я мог сделать это по-другому. Согласно этому вопросу / ответу, я должен получить BodyTypes 3 для целого числа со знаком, 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 ответ

Вы также можете использовать BinaryMessageFormatter. Независимо от того, читаете ли вы / пишете, лучше настроить Formatter, так что вы на 100% уверены, что можете де / сериализовать на обоих концах.

Вы также можете щелкнуть правой кнопкой мыши "Мой компьютер"> "Управление"> "Службы и приложения"> "Очередь сообщений".

Там вы сможете увидеть текст сообщения и дважды проверить свою логику.

Другие вопросы по тегам