我正在使用BizTalk Server SB消息适配器来从Azure Service Bus队列检索消息。我已经成功地(使用相同的适配器)成功地将消息发送到队列中,并从队列中检索消息并进行了进一步处理。
当第三方软件供应商将消息发送到队列中,并且BizTalk Server检索和处理消息时,就会出现问题。然后,我在消息的开头收到以下附加的“标头”信息和控制字符:
在文本中:@ACKstringBShttp://schemas.microsoft.com/2003/10/Serialization/?$ SOH
似乎存在某种封装的消息,包括用于处理消息到队列确认的标头。
SB消息传递适配器给出了以下初始错误消息:
”地址处的WCF服务主机出现故障,因此没有 可以在相应的接收位置接收更多消息。 若要解决此问题,BizTalk Server将自动尝试重新启动 服务主机。”
然后,另一个错误消息:
“没有反汇编平台组件可以识别数据。”
有人以前曾遇到过这个问题吗,那是什么原因引起的?字符编码是否可能是此问题的原因?
答案 0 :(得分:0)
以下是反馈!
事实证明,第三方软件供应商可以将消息发送为流而不是字符串。原来这是一个使用BrokeredMessage对象的.Net应用程序。使用字符串可使消息序列化,并将元数据添加到消息中。使用流,不会发生此类序列化,并且消息保持不变。
因此,问题在于发送到Service Bus Queue时使用了字符串和自动序列化。
答案 1 :(得分:0)
我有旧式Microsoft.ServiceBus.Messaging
客户以BrokeredMessage
的形式发送<string>
Xml内容,并且希望使用最新的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/