繁体   English   中英

Azure 服务总线消息在运行时在订阅中反序列化为未知类型

[英]Azure Service Bus Message deserialize to an unknown type at runtime in subscriptions

令人惊讶的是,但我还没有找到一个示例,其中订阅时收到的 Message 可能是不同类型的,并且需要知道类型才能使用正确的类型反序列化其内容。 这是相关的,但它没有考虑这种情况

我有一个发布订阅者场景。 对于订阅者,根据https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-创建可以使用 Azure 服务总线库发布的Message to-use-topics-subscriptions我需要传递一个字节数组。 它似乎没有像自定义元数据这样的东西,我可以用它来指定消息或类似的程序集类型。

当订阅收到消息时,它必须反序列化它,但我无法知道特定消息是哪种类型才能执行JsonConvert.DeserializeObject<TDestType>(Encoding.UTF8.GetString(message.Body))

有没有人有任何链接或样本来实现这一目标? 或者是仅对一种类型的消息使用主题和主题订阅的推荐做法? (我对此表示怀疑,但我知道 MassTransit 例如在幕后为每条消息创建一个主题..)


更新 1:现在我将使用 Message 中的 ContentType 属性来存储 EventType,以便订阅者可以使用它来反序列化。 但是如果感觉“hacky”,因为这个字段应该存储格式类型(json、xml 等)

它似乎没有像自定义元数据这样的东西,我可以用它来指定消息或类似的程序集类型。

Azure 服务总线确实为每条消息提供可用作UserProperties标头/元数据。 一个主题可以接收多种消息类型,订阅者可以查看他们将使用订阅处理哪些消息。 订阅可以是简单的订阅并使用相关过滤器利用消息的ContentType属性,也可以使用更高级的SQL 过滤器来提供更高级的订阅机制。

现在,我将使用 Message 中的 ContentType 属性来存储 EventType,以便订阅者可以使用它来反序列化。 但是如果感觉“hacky”,因为这个字段应该存储格式类型(json、xml 等)

您可以保留ContentType进行序列化,并使用自定义标头为订阅者过滤消息。 或者您可以选择将两者都存储在自定义标头中。 这是你的电话。

令人惊讶的是,但我还没有找到一个示例,其中订阅时收到的 Message 可能是不同类型的,并且需要知道类型才能使用正确的类型反序列化其内容。

这就是NServiceBus使用 Azure 服务总线作为传输所做的事情。 单个接收器(端点)可以处理不同的消息类型。 订阅者创建过滤器来检查自定义标头值以确定消息的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM