来自服务总线中转消息的未知 xml 序列化 content/namespace
Unknown xml serialization content/namespace from Service bus brokered message
您好,我想知道为什么当我从主题中获取消息时,我会在来自服务总线的代理消息内容中获得一个特殊的命名空间。我该如何删除它?
我有我的 xml,当我(在我的 Azure 函数中)尝试从服务总线检索消息时,我把它放在一切之上,或者最好在我的根节点之前说:
@string3http://schemas.microsoft.com/2003/10/Serialization/��
<rootNode>...</rootNode>
当我在我的 azure 函数中从我的服务总线检索代理消息时,我是这样做的:
string BrokeredMessageBody = mySbMsg.GetBody<string>();
仅供参考:在 Azure 函数中,xml 看起来不错,但是当我的逻辑应用程序获取它时,它会以某种方式添加指定的上述命名空间 earlier/above。
有人遇到过这个吗?
我猜这就是您发送消息的方式:
string content = "My message";
var message = new BrokeredMessage(content);
但是,这不会按原样发送您的内容。您实际上正在使用此构造函数重载:
public BrokeredMessage(object serializableObject)
确实如此:
Initializes a new instance of the BrokeredMessage class from a given
object by using DataContractSerializer with a binary
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();
}
您好,我想知道为什么当我从主题中获取消息时,我会在来自服务总线的代理消息内容中获得一个特殊的命名空间。我该如何删除它?
我有我的 xml,当我(在我的 Azure 函数中)尝试从服务总线检索消息时,我把它放在一切之上,或者最好在我的根节点之前说:
@string3http://schemas.microsoft.com/2003/10/Serialization/��
<rootNode>...</rootNode>
当我在我的 azure 函数中从我的服务总线检索代理消息时,我是这样做的:
string BrokeredMessageBody = mySbMsg.GetBody<string>();
仅供参考:在 Azure 函数中,xml 看起来不错,但是当我的逻辑应用程序获取它时,它会以某种方式添加指定的上述命名空间 earlier/above。
有人遇到过这个吗?
我猜这就是您发送消息的方式:
string content = "My message";
var message = new BrokeredMessage(content);
但是,这不会按原样发送您的内容。您实际上正在使用此构造函数重载:
public BrokeredMessage(object serializableObject)
确实如此:
Initializes a new instance of the BrokeredMessage class from a given object by using DataContractSerializer with a binary 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();
}