Получение сообщения с помощью Azure.Messaging.ServiceBus, отправленного с помощью Microsoft.ServiceBus.Messaging (ServiceBus.v1_1)

Мы отправляем сообщения служебной шины с помощью старой библиотеки через Microsoft.ServiceBus.Messaging, которая доступна в nuget-пакете ServiceBus.v1_1, и хотим получить и проанализировать сообщение с помощью новейшего клиента служебной шины: Azure.Messaging.ServiceBus.

[FunctionName("FunctionHandler")]
public async Task RunFunction(
    [ServiceBusTrigger("%ServiceBusQueueName%", Connection = ApFunctionDefaults.ServiceBusNames.ServiceBusConnectionString)]
    ServiceBusReceivedMessage queueMessage)
{
    var jsonSettings = KnownTypesBinder.GetSerializerSettings(KnownTypeProvider.GetKnownTypes());
    command = JsonConvert.DeserializeObject<MyDto>(Encoding.UTF8.GetString(queueMessage.Body), jsonSettings); // <- throws an exception
}

Тело сообщения queueMessage.Body имеет такое значение:

@\u000eCommandMessage\bUhttp://schemas.datacontract.org/2004/07/ ...more payload here... a\u0001"

С помощью JsonConvert.DeserializeObject мы получаем исключение формата.

Как десериализовать сообщение, отправленное Microsoft.ServiceBus.Messaging (Nuget-Package: ServiceBus.v1_1), с помощью Azure.Messaging.ServiceBus?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Устаревший пакет использует DataContractSerializer для кодирования полезных данных, тогда как новые поколения рассматривают полезные данные сообщения как непрозрачный блок байтов. Чтобы обработать сообщение с помощью Azure.Messaging.ServiceBus, вам необходимо расшифровать тело.

// receive the message
var receiver = client.CreateReceiver(queueName);
var receivedMessage = await receiver.ReceiveMessageAsync();

// deserialize the XML envelope into a string
var deserializer = new DataContractSerializer(typeof(MyDto));

var reader = XmlDictionaryReader.CreateBinaryReader(
    receivedMessage.Body.ToStream(), 
    XmlDictionaryReaderQuotas.Max);

MyDto myDto = deserializer.ReadObject(reader);

Дополнительный контекст и обсуждение можно найти в примере взаимодействия Service Bus .

Ваше решение можно использовать при отправке сообщений с помощью WindowsAzure.ServiceBus. Но в моем случае мы отправляем сообщения с помощью Microsoft.ServiceBus.Messaging.

Simon 24.06.2024 18:40

Извините за путаницу. Microsoft.ServiceBus.Messaging — это пространство имен, используемое WindowsAzure.ServiceBus, и его часто путают с именем пакета. Поскольку я никогда раньше не видел ServiceBus.v1_1 и был шокирован тем, что он не был помечен как неподдерживаемый, я передал это команде Service Bus. Код недоступен для меня изнутри, чтобы увидеть, как они кодируют/сериализуют.

Jesse Squire 24.06.2024 21:34

По словам команды Service Bus, этот пакет был связан с продуктом Service Bus for Windows Server, срок эксплуатации которого истек в 2023 году и больше не поддерживается. Пакет никогда не предназначался для использования со служебной шиной Azure, и подробности его внутреннего устройства больше не известны. Я сообщил, что они пропустили прекращение поддержки/удаление пакета SDK и будут следить за тем, чтобы он был помечен как таковой в NuGet. Learn.microsoft.com/en-us/lifecycle/products/…

Jesse Squire 24.06.2024 21:41

Я исправил некоторый код в вашем ответе, который теперь работает с моим прототипом, несмотря на использование Microsoft.ServiceBus.Messaging (ServiceBus.v1_1).

Simon 25.06.2024 09:49

Другие вопросы по теме