How to send customer-defined type through MessageQueue
-
22-06-2021 - |
سؤال
Given this event
public class DummyEvent : EventDTO{
public CustomUUID Cid { get; set; }
public DateTime Date { get; set; }
public Guid Id { get; set; }
}
I'm sending messages via MSMQ:
var de = new DummyEvent {
Date = DateTime.UtcNow,
Id = Guid.NewGuid(),
Cid = Guid.NewGuid()
};
var mq = new MessageQueue(AppSettings.EventQueue);
mq.Formatter = new XmlMessageFormatter(new[]{de.GetType()});
mq.Send(de);
var e = reciever.Receive().Body;
Date is System.DateTime so it gets deserialized ok.
Id is System.Guid so it gets deserialized ok.
Cid is CustomUUID which is a user defined type that doesnt get deserialized.
I need to send customer-defined types as well, but there is scarce info on the net.
EDIT: It actually doesn't get serialized, so the problem is at Sending the message
المحلول
Here is the sample
using System;
using System.Messaging;
namespace MsmqSample
{
internal class Program
{
private static MessageQueue _queue;
private static readonly BinaryMessageFormatter _formatter = new BinaryMessageFormatter();
private static void Main(string[] args)
{
const string queueName = @".\private$\TaskQueue";
if (!MessageQueue.Exists(queueName))
{
MessageQueue.Create(queueName, true);
}
_queue = new MessageQueue(queueName);
_queue.Purge();
AddMessage();
Console.ReadKey();
}
private static void AddMessage()
{
using (var transaction = new MessageQueueTransaction())
{
try
{
transaction.Begin();
var externalMessage = new ExternalMessage {Data = "Test Data"};
_queue.Send(new Message(externalMessage, _formatter), transaction);
transaction.Commit();
}
catch (Exception)
{
transaction.Abort();
}
}
}
}
[Serializable]
public class ExternalMessage
{
public string Data;
public ExternalMessage()
{
Content = new MessageContent {Guid = Guid.NewGuid()};
}
public MessageContent Content { get; set; }
}
[Serializable]
public class MessageContent
{
public Guid Guid { get; set; }
}
}
لا تنتمي إلى StackOverflow