带有具有抽象主体的消息的Azure服务总线

本文关键字:Azure 总线 消息 服务 主体 抽象 | 更新日期: 2023-09-27 18:18:59

我使用Azure主题和订阅作为消息总线。但是当我做message.GetBody()时,我得到了一个SerializationException。我想要实现的是有一个订阅者读取BaseEvent类型的所有事件,并且每个事件都有自己的订阅者。但是当我试图序列化body (BaseEvent)时,它失败了。那么我如何序列化body来同时获得UserEvent和TeamEvent呢?我的代码是这样的:

public abstract class BaseEvent
{
    public long ActivityId { get; set; }
}
public class UserEvent
{
    public string Name { get; set; }
}
public class TeamEvent
{
    public string Name { get; set; }
}

我像这样将它们添加到消息总线:

public async Task HandleAsync(BaseEvent request)
{
     var message = new BrokeredMessage(request)
     {
         CorrelationId = request.Id.ToString()
     };
     await topicClient.SendAsync(message);
     await topicClient.CloseAsync();
}

当我要从总线上读取时,我这样做:

BrokeredMessage message;
while ((message = client.Receive(new TimeSpan(0, 0, 5))) != null)
{
    models.Add(message.GetBody<BaseEvent>()); // THIS FAILS SerlizationException
    message.Complete();
}

带有具有抽象主体的消息的Azure服务总线

作为BrokeredMessage构造函数声明:

public BrokeredMessage(
    Object serializableObject
)

它通过使用带有二进制XmlDictionaryWriter的DataContractSerializer从给定对象初始化BrokeredMessage类的新实例。所以类BaseEvent必须支持DataContractSerializer。如何做到这一点,请参考序列化和反序列化