Это - , вызванное тем, как сообщение помещается в ServiceBus, в частности в код C #. Я использовал следующий код для добавления нового сообщения:
var json = JsonConvert.SerializeObject(item);
var message = new BrokeredMessage(json);
await TopicClient.SendAsync(message);
Этот код выглядит нормально и работает между различными службами C # без проблем. Проблема вызвана тем, что конструктор BrokeredMessage(Object)
сериализует передаваемую ему полезную нагрузку:
Инициализирует новый экземпляр класса BrokeredMessage из заданного объекта с помощью DataContractSerializer с двоичным XmlDictionaryWriter.
Это означает, что содержимое сериализуется в виде двоичного XML, что объясняет префикс и нераспознаваемые символы. Это скрыто реализацией C # при десериализации и возвращает ожидаемый объект, но становится очевидным при использовании другой библиотеки (например, библиотеки Azure Logic Apps).
Есть две альтернативы для решения этой проблемы:
- Убедитесь, что получатель может обрабатывать сообщения в двоичном формате XML
- Убедитесь, что отправитель действительно использует нужный нам формат, например, JSON.
Ответ Пако де ла Круса обрабатывает первый случай, используя substring
, indexOf
и lastIndexOf
:
@json(substring(base64ToString(triggerBody()?['ContentData']), indexof(base64ToString(triggerBody()?['ContentData']), '{'), add(1, sub(lastindexof(base64ToString(triggerBody()?['ContentData']), '}'), indexof(base64ToString(triggerBody()?['ContentData']), '}')))))
Что касается второго случая, то устранение проблемы в источнике просто предполагает использование конструктора BrokeredMessage(Stream)
. Таким образом, мы имеем прямой контроль над контентом:
var json = JsonConvert.SerializeObject(item);
var bytes = Encoding.UTF8.GetBytes(json);
var stream = new MemoryStream(bytes);
var message = new BrokeredMessage(stream, true);
await TopicClient.SendAsync(message);