Azure 服务总线中转消息反序列化

Azure Service Bus Brokered Message Deserialization

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

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

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

我可以从流中读取它并将其转换为字符串,但不能这样做: var myDTO = message.GetBody(); 这会引发序列化异常。我还尝试了一个传递 DataContractSerializer 的变体——尽管我认为这是默认设置。

此外,我真正需要的是一种在不知道主体中数据类型的情况下执行此操作的方法 - 可以想象,我可以为主体中序列化的类型添加更多 message.Properties 但我认为必须是仅使用体内数据的直接方法 - 毕竟 WCF 和类似技术可以轻松做到这一点。但是怎么办?

感谢您的帮助, 会

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

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

这差不多就是SOAP如何基于WCF服务do/did了。

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

你也可能是hitting this issue.