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://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messages-payloads#payload-serialization

https://carlos.mendible.com/2016/07/17/step-by-step-net-core-azure-service-bus-and-amqp/