c# - 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 等)
解决方案
它似乎没有任何类似自定义元数据的东西,我可以用它来指定消息或类似的程序集类型。
Azure 服务总线确实提供UserProperties
与每条消息一样可用的标头/元数据。一个主题可以接收多种消息类型,订阅者可以查看他们将使用订阅处理哪些消息。订阅可以是一个简单的订阅并使用相关过滤器ContentType
利用消息的属性,也可以使用更高级的SQL 过滤器来提供更高级的订阅机制。
现在,我将使用 Message 中的 ContentType 属性来存储 EventType,以便订阅者可以使用它来反序列化。但是如果感觉“hacky”,因为该字段应该存储格式类型(json、xml 等)
您可以保留ContentType
序列化并使用自定义标头为订阅者过滤消息。或者您可以选择将两者都存储在自定义标题中。这是你的电话。
令人惊讶的是,但我还没有找到一个示例,其中订阅时收到的消息可能是不同类型的,并且需要知道类型才能使用正确的类型反序列化其内容。
这就是NServiceBus将 Azure 服务总线用作传输的方式。单个接收器(端点)可以处理不同的消息类型。订阅者创建过滤器来检查自定义标头值以确定消息的类型。
推荐阅读
- google-apps-script - 从一个电子表格更新到另一个电子表格时附加多行
- angular - 寻找使用 ngrx 8 沉浸式生产的示例
- javascript - 未填充 Google Analytics(分析)自定义维度
- java - 哪个更快:标准查询或本机查询?
- reactjs - 如何理解 Reactjs 中用于从服务器获取数据的端点
- powerbi - Power BI 仪表板在 Big TV 中不刷新
- c++ - 对外部模板 constexpr 构造函数的未定义引用
- sap-cloud-sdk - 如何在 Kubernetes 上运行 SAP Cloud SDK 管道
- android - app:compileDebugJavaWithJavac 在 React Native 中构建 Andriod 时失败
- sublimetext3 - SublimeText:将 cmdlime 输出重定向到文件没有发生