Неизвестное содержимое / пространство имен сериализации xml из сообщения брокера Service Bus

Привет, мне было интересно, почему я получаю специальное пространство имен в своем контенте с помощью моей служебной шины, когда я получаю сообщение из темы. и как мне это убрать?

у меня есть xml, и когда я (в своей функции Azure) пытаюсь извлечь сообщение из служебной шины, я получаю это поверх всего или лучше сказать перед моим корневым узлом:

@string3http://schemas.microsoft.com/2003/10/Serialization/��
    <rootNode>...</rootNode>

когда я получаю сообщение брокера из моей сервисной шины в своей функции Azure, я делаю это так:

string BrokeredMessageBody = mySbMsg.GetBody<string>();

К сведению: в функции Azure xml выглядит нормально, но когда мое логическое приложение получает его, оно каким-то образом добавляет указанное выше пространство имен, как указано ранее / выше.

Кто-нибудь сталкивался с этим раньше?

1 ответ

Решение

Я думаю, что именно так вы отправляете свои сообщения:

string content = "My message";
var message = new BrokeredMessage(content);

Тем не менее, это не отправляет ваш контент как есть. Вы фактически используете эту перегрузку конструктора:

public BrokeredMessage(object serializableObject)

и это делает:

Инициализирует новый экземпляр класса BrokeredMessage из данного объекта, используя DataContractSerializer с двоичным XmlDictionaryWriter.

Таким образом, ваша строка сериализуется в XML, а затем форматируется с двоичным форматированием. Это то, что вы видите в содержимом сообщения (пространство имен и некоторые нечитаемые символы).

Ваша функция Azure работает нормально, потому что mySbMsg.GetBody<string>(); делает наоборот - десериализует сообщение из двоичного XML.

Чтобы сериализовать контент как есть, вы должны использовать Streamперегрузка конструктора:

string content = "My message";
var message = new BrokeredMessage(new MemoryStream(Encoding.UTF8.GetBytes(content)), true);

Обратите внимание, что вы сами определяете кодировку строки (в моем примере UTF-8).

Чтение становится немного более сложным:

using (var stream = message.GetBody<Stream>())
using (var streamReader = new StreamReader(stream, Encoding.UTF8))
{
    content = streamReader.ReadToEnd();
}
Другие вопросы по тегам