#deserialization #azure-service-fabric #azure-servicebus-queues #brokeredmessage
#десериализация #azure-service-fabric #azure-servicebus-очереди #brokeredmessage
Вопрос:
Я отправляю сообщения в ASB, используя WCF NetMessaging. Сообщение может содержать любое количество пользовательских контрактов с данными.
У меня есть служба Service Fabric без состояния с пользовательским прослушивателем для ASB, доставляющим сообщения, помещенные в очередь. Все примеры, которые я видел, способны обрабатывать только один тип сообщений (кажется, большинство рекомендаций заключается в сериализации в JSON, но это не то, что мне нужно здесь делать). Я хочу, чтобы подписчик очереди мог обрабатывать несколько сообщений (любое сообщение, отправленное на любое действие службы).
Я могу добавить действие в BrokeredMessage.Свойства, чтобы я знал, куда их отправить. Проблема в том, что я не понял, как десериализовать тело сообщения любым работающим способом.
Я могу прочитать это из потока и преобразовать в строку, но не могу этого сделать: var myDTO = message.getBody(); Который генерирует исключения сериализации. Я также пробовал вариант такой передачи в DataContractSerializer — хотя я думаю, что это значение по умолчанию.
Кроме того, что мне действительно нужно, так это способ сделать это, не зная типа данных в теле — я мог бы, предположительно, добавить больше сообщений.Свойства для типов, сериализованных в теле, но я полагаю, что должен быть прямой способ сделать это, используя только данные в теле — в конце концов, WCF и подобные технологии делают это с легкостью. Но как?
Спасибо за любую помощь, будет
Ответ №1:
Чтобы иметь автономное тело сообщения:
Создайте тип конверта, который описывает содержимое (имя типа, отправителя, временную метку и т.д.) И содержит свойство полезной нагрузки (string), содержащее сериализованный объект. Для отправки сообщений необходимо сериализовать (сжать, зашифровать) объект, присвоив результат свойству полезной нагрузки экземпляра Envelope. Сериализуйте конверт и отправьте его. Чтобы получать сообщения, десериализуйте тело сообщения в конверт, изучите информацию о типе и десериализуйте полезную нагрузку.
Примерно так это делают службы WCF на основе SOAP.
Убедитесь, что ваш DTO является сериализуемым с помощью datacontract, создав несколько модульных тестов. Имейте в виду, что размер тела сообщения в ASB ограничен, XML может быть не лучшим выбором для сериализации.
Вы также можете столкнуться с этой проблемой.