Неизвестное содержимое / пространство имен сериализации 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();
}