Очередь сообщений 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% уверены, что можете де / сериализовать на обоих концах.
Вы также можете щелкнуть правой кнопкой мыши "Мой компьютер"> "Управление"> "Службы и приложения"> "Очередь сообщений".
Там вы сможете увидеть текст сообщения и дважды проверить свою логику.