Azure 服务总线 Queue 在获取的消息中提供控制字符
Azure Service Bus Queue gives control characters in fetched message
我正在使用 BizTalk Server SB-Messaging 适配器从 Azure 服务总线 Queue 检索消息。我已经成功地将消息发送给 queue 我自己(使用相同的适配器),并从 queue 检索消息并进行进一步处理。
当第 3 方软件供应商向 queue 发送消息以及 BizTalk Server 检索和处理消息时出现问题。然后我在邮件开头收到以下附加 "header" 信息和控制字符:
正文:@ACKstringBShttp://schemas.microsoft.com/2003/10/Serialization/?$SOH
似乎有某种封装的消息,包括 headers 来处理对 queue 消息的确认。
SB-Messaging 适配器给出了以下初始错误消息:
"The WCF service host at address has faulted and as a result no
more messages can be received on the corresponding receive location.
To fix the issue, BizTalk Server will automatically attempt to restart
the service host."
还有一条错误信息:
"No Disassemble stage components can recognize the data."
以前有没有人遇到过这个问题,问题的原因是什么?字符编码可能是导致此问题的原因吗?
反馈来了!
原来第 3 方软件供应商设置了以流而不是字符串形式发送消息的设置。原来它是一个使用 BrokeredMessage 对象的 .Net 应用程序。使用字符串使消息序列化,并将元数据添加到消息中。使用流,不会发生这样的序列化,并且消息保持不变。
所以,问题是在发送到服务总线队列时使用字符串和自动序列化。
我有遗留 Microsoft.ServiceBus.Messaging
客户发送 BrokeredMessage
Xml 内容作为 <string>
我想使用最新的 Microsoft.Azure.ServiceBus
库和 Message
类型。
使用 Encoding.UTF8.GetString(message.Body)
我得到一个无法使用的字符串
@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/��#
我的方法是显式地使用 XmlDictionaryReader 二进制反序列化来从遗留库中撤消隐藏的序列化魔法
private static string GetMessageBodyHandlingLegacyBrokeredMessage(Message message)
{
string str = null;
if (message.ContentType == null)
{
using (var reader = XmlDictionaryReader.CreateBinaryReader(
new MemoryStream(message.Body),
null,
XmlDictionaryReaderQuotas.Max))
{
var doc = new XmlDocument();
doc.Load(reader);
str = doc.InnerText;
}
}
else
throw new NotImplementedException("Unhandled Service Bus ContentType " + message.ContentType);
return str;
}
参考资料
https://carlos.mendible.com/2016/07/17/step-by-step-net-core-azure-service-bus-and-amqp/
我正在使用 BizTalk Server SB-Messaging 适配器从 Azure 服务总线 Queue 检索消息。我已经成功地将消息发送给 queue 我自己(使用相同的适配器),并从 queue 检索消息并进行进一步处理。
当第 3 方软件供应商向 queue 发送消息以及 BizTalk Server 检索和处理消息时出现问题。然后我在邮件开头收到以下附加 "header" 信息和控制字符:
正文:@ACKstringBShttp://schemas.microsoft.com/2003/10/Serialization/?$SOH
似乎有某种封装的消息,包括 headers 来处理对 queue 消息的确认。
SB-Messaging 适配器给出了以下初始错误消息:
"The WCF service host at address has faulted and as a result no more messages can be received on the corresponding receive location. To fix the issue, BizTalk Server will automatically attempt to restart the service host."
还有一条错误信息:
"No Disassemble stage components can recognize the data."
以前有没有人遇到过这个问题,问题的原因是什么?字符编码可能是导致此问题的原因吗?
反馈来了!
原来第 3 方软件供应商设置了以流而不是字符串形式发送消息的设置。原来它是一个使用 BrokeredMessage 对象的 .Net 应用程序。使用字符串使消息序列化,并将元数据添加到消息中。使用流,不会发生这样的序列化,并且消息保持不变。
所以,问题是在发送到服务总线队列时使用字符串和自动序列化。
我有遗留 Microsoft.ServiceBus.Messaging
客户发送 BrokeredMessage
Xml 内容作为 <string>
我想使用最新的 Microsoft.Azure.ServiceBus
库和 Message
类型。
使用 Encoding.UTF8.GetString(message.Body)
我得到一个无法使用的字符串
@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/��#
我的方法是显式地使用 XmlDictionaryReader 二进制反序列化来从遗留库中撤消隐藏的序列化魔法
private static string GetMessageBodyHandlingLegacyBrokeredMessage(Message message)
{
string str = null;
if (message.ContentType == null)
{
using (var reader = XmlDictionaryReader.CreateBinaryReader(
new MemoryStream(message.Body),
null,
XmlDictionaryReaderQuotas.Max))
{
var doc = new XmlDocument();
doc.Load(reader);
str = doc.InnerText;
}
}
else
throw new NotImplementedException("Unhandled Service Bus ContentType " + message.ContentType);
return str;
}
参考资料
https://carlos.mendible.com/2016/07/17/step-by-step-net-core-azure-service-bus-and-amqp/