首页 > 解决方案 > Azure 服务总线消息在订阅中的运行时反序列化为未知类型

问题描述

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

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

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

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


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

标签: c#.netserializationazureservicebusazure-servicebus-subscriptions

解决方案


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

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

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

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

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

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


推荐阅读