来自Service busbrored消息的未知xml序列化内容/命名空间

时间:2017-06-26 12:22:37

标签: xml serialization namespaces azureservicebus brokeredmessage

嗨我想知道为什么当我从主题中获取消息时,我的服务总线中的代理消息内容中有一个特殊的命名空间。以及如何删除它?

我有我的xml,当我(在我的Azure功能中)尝试从服务总线检索消息时,我会在所有内容之上获取此信息,或者在我的根节点之前更好地说:

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

当我在我的azure函数中从servicebus中检索代理消息时,我这样做:

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

仅供参考:在Azure函数中,xml看起来没问题,但是当我的逻辑应用程序获得它时,它会以某种方式添加上面/上面指定的上述命名空间。

之前有人遇到过这个吗?

1 个答案:

答案 0 :(得分: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();
}