Десериализация сообщений с посреднической шиной Azure Service Bus - PullRequest
0 голосов
/ 05 апреля 2019

Я отправляю сообщения в ASB с помощью WCF NetMessaging.Сообщение может содержать любое количество пользовательских контрактов данных.

У меня есть служба без учета состояния Service Fabric с настраиваемым прослушивателем для ASB, доставляющего сообщения, помещенные в очередь.Все примеры, которые я видел, способны обрабатывать только один тип сообщения (кажется, что большинство рекомендаций - сериализация в JSON, но это не то, что мне нужно здесь делать).Я хочу, чтобы подписчик в очереди мог обрабатывать несколько сообщений (любое сообщение, отправленное на любое действие службы).

Я могу добавить действие в BrokeredMessage.Properties, чтобы я знал, гдеОтправь это.Проблема в том, что я не выяснил, как десериализовать тело сообщения любым способом, который работает.

Я могу прочитать его из потока и передать в строку, но не могу этого сделать: var myDTO =message.GetBody ();Это бросает исключения сериализации.Я также попробовал вариант такой передачи в DataContractSerializer - хотя я думаю, что это значение по умолчанию.

Кроме того, мне действительно нужен способ сделать это, не зная тип данных в теле- Я мог бы, конечно, добавить больше сообщений. Свойства для типов, сериализованных в теле, но я полагаю, что должен быть прямой способ сделать это, используя только данные в теле - после того, как все WCF и подобные техники делают это с легкостью.Но как?

Спасибо за любую помощь, Уилл

1 Ответ

1 голос
/ 08 апреля 2019

Чтобы иметь отдельное тело сообщения:

Создайте тип конверта, который описывает содержимое (имя типа, отправитель, метка времени и т. Д.) И содержит свойство полезной нагрузки (строка) для содержания сериализованногообъект.Для отправки сообщений вы сериализуете (сжимаете, шифруете) объект, присваиваете результат свойству payload экземпляра Envelope.Сериализуйте конверт и отправьте его.Для получения сообщений десериализуйте тело сообщения в конверт, изучите информацию о типе и выполните десериализацию полезной нагрузки.

Это более или менее то, как службы WCF на основе SOAP делают / сделали это.

Убедитесь, что ваш DTO datacontract-serializable , создаваянекоторые юнит-тесты.Имейте в виду, что размер тела сообщения в ASB ограничен, XML может быть не лучшим выбором для сериализации.

Возможно, вы также решаете эту проблему .

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