Мы отправляем сообщения служебной шины с помощью старой библиотеки через 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?
Устаревший пакет использует 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 .
Извините за путаницу. Microsoft.ServiceBus.Messaging — это пространство имен, используемое WindowsAzure.ServiceBus, и его часто путают с именем пакета. Поскольку я никогда раньше не видел ServiceBus.v1_1 и был шокирован тем, что он не был помечен как неподдерживаемый, я передал это команде Service Bus. Код недоступен для меня изнутри, чтобы увидеть, как они кодируют/сериализуют.
По словам команды Service Bus, этот пакет был связан с продуктом Service Bus for Windows Server, срок эксплуатации которого истек в 2023 году и больше не поддерживается. Пакет никогда не предназначался для использования со служебной шиной Azure, и подробности его внутреннего устройства больше не известны. Я сообщил, что они пропустили прекращение поддержки/удаление пакета SDK и будут следить за тем, чтобы он был помечен как таковой в NuGet. Learn.microsoft.com/en-us/lifecycle/products/…
Я исправил некоторый код в вашем ответе, который теперь работает с моим прототипом, несмотря на использование Microsoft.ServiceBus.Messaging (ServiceBus.v1_1).
Ваше решение можно использовать при отправке сообщений с помощью WindowsAzure.ServiceBus. Но в моем случае мы отправляем сообщения с помощью Microsoft.ServiceBus.Messaging.