Azure Service Bus Brokered消息反序列化

问题描述 投票:0回答:1

我正在使用WCF NetMessaging向ASB发送消息。该消息可以包含任意数量的自定义数据协定。

我有一个Service Fabric无状态服务,带有一个ASB自定义侦听器,可以将消息推送到队列中。我见过的所有示例都只能处理单一类型的消息(似乎大多数指导是可序列化为JSON,但这不是我需要在这里做的)。我希望队列中的订阅者能够处理许多消息(发送给服务的任何操作的任何消息)。

我能够将Action添加到BrokeredMessage.Properties,所以我知道在哪里发送它。问题是我还没有弄清楚如何以任何有效的方式反序列化消息体。

我可以从流中读取它并将其转换为字符串,但不能这样做:var myDTO = message.GetBody();这引发了序列化异常。我也尝试过传入DataContractSerializer的变体 - 即使我认为这是默认值。

此外,我真正需要的是一种方法,在不知道正文中的数据类型的情况下这样做 - 可以想象,我可以添加更多的消息。在体内序列化的类型的属性,但我认为必须有一个直接的方式仅使用正文中的数据 - 在所有WCF和类似技术人员轻松完成此操作之后。但是怎么样?

感谢任何帮助,威尔

deserialization azure-service-fabric azure-servicebus-queues brokeredmessage
1个回答
1
投票

要拥有一个独立的邮件正文:

创建描述内容的信封类型(类型名称,发件人,时间戳等),并保存有效内容(字符串)属性以包含序列化对象。要发送消息,您可以序列化(压缩,加密)对象,将结果分配给Envelope实例的payload属性。序列化信封并发送出去。要接收消息,请将消息正文反序列化为信封,检查类型信息,并对有效负载进行反序列化。

这或多或少是基于SOAP的WCF服务做/做的。

通过创建一些单元测试,确保您的DTO是datacontract-serializable。请记住,消息体大小在ASB中是有限的,XML可能不是您序列化的最佳选择。

你也许是hitting this issue

© www.soinside.com 2019 - 2024. All rights reserved.