Azure Сообщение служебной шины десериализуется до неизвестного типа во время выполнения в подписках. - PullRequest
2 голосов
/ 10 марта 2020

Удивительно, но я еще не нашел пример, где Сообщение, полученное по подписке, могло бы быть разных типов, и тип должен быть известен, чтобы десериализовать его содержимое с правильным типом. Это связано , но это не предполагает сценарий

У меня есть сценарий publi sh -подписчиков. Для подписчика, чтобы создать Message, который может быть опубликован с помощью библиотеки Azure Service Bus согласно https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-how-to-use-topics-subscriptions, мне нужно передать массив байтов. Кажется, в нем нет ничего похожего на пользовательские метаданные, которые я мог бы использовать для указания типа сборки для сообщения или аналогичного.

Когда подписка получает сообщение, она должна десериализовать его, но я не могу знать, какой тип конкретное c сообщение для того, чтобы сделать JsonConvert.DeserializeObject<TDestType>(Encoding.UTF8.GetString(message.Body))

У кого-нибудь есть какая-либо ссылка или пример для достижения этой цели? Или рекомендуется использовать подписку topi c и подписку topi c только для одного типа сообщений? (Я сомневаюсь в этом, но я знаю, что MassTransit, например, создает topi c для каждого сообщения за кулисами ..)


UPDATE 1: сейчас я буду использовать свойство ContentType в сообщении хранить EventType так, чтобы suscriptor мог использовать его для десериализации. Но если он чувствует себя «хакером», потому что в этом поле предполагается хранить тип формата (json, xml, et c.)

1 Ответ

1 голос
/ 10 марта 2020

Кажется, что в нем нет ничего похожего на пользовательские метаданные, которые я мог бы использовать для указания типа сборки для сообщения или аналогичного.

Azure Шина обслуживания предлагает заголовки / метаданные доступно как UserProperties с каждым сообщением. Topi c может принимать сообщения нескольких типов, а подписчики могут просматривать, какие из них они будут обрабатывать с помощью подписок. Подписка может быть простой и использовать свойство ContentType сообщения, используя корреляционные фильтры , или иметь более продвинутые SQL фильтры для обеспечения более совершенного механизма подписки.

Сейчас я буду использовать свойство ContentType в Message для хранения EventType, чтобы его мог использовать дескриптор для десериализации. Но если он чувствует себя «хакером», потому что в этом поле предполагается хранить тип формата (json, xml и т. Д. 1032 *.)

Вы можете оставить ContentType для сериализации и использования. Пользовательские заголовки для фильтрации сообщений для подписчиков. Или вы можете сохранить оба в пользовательских заголовках. Это ваш звонок.

Удивительно, но я пока не нашел образец, где Сообщение, полученное по подписке, могло бы быть разных типов, и тип должен быть известен, чтобы десериализовать его содержимое. с правильным типом.

Это то, что NServiceBus делает с Azure Service Bus в качестве транспорта. Один получатель (конечная точка) может обрабатывать сообщения разных типов. Подписчик создает фильтры, которые проверяют пользовательское значение заголовка, чтобы определить тип сообщения.

...