我使用 qpid-proton v0.29 for C++ 编写 Microsoft Event Hub 生产者应用程序和 Microsoft.Azure.EventHubs v4.2 编写 Microsoft Event Hub 消费者时遇到了同样的问题。消息正文开头的第一个“垃圾”字节是 AMQP“嵌入式构造函数”,它指定后面字节的格式。在您的屏幕截图中,正文格式看起来像是一个字符串,例如“hello world”。在这种情况下,“嵌入式构造函数”为 0xA1,表示后面的字节是 ASCII,并且它们的数量是可变的。第二个“垃圾”字节是 ASCII 字符串中的字节数。对于“hello world”,这将是 11。我不确定 Microsoft 库为什么不为您解析它。
AMQP 数据类型:http ://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html#section-types
AMQP 消息格式:http ://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-message-format
AMQP 规范规定消息体可以是“AMQP 值”、“数据”或“AMQP 序列”类型。如果消息正文的类型为“AMQP 值”,我发现 Microsoft 库不喜欢它。如果它是“AMQP 值”,更新的 Microsoft 库 Azure.Messaging.EventHubs v5.0.1 甚至不会解析正文数据。它始终在消息正文中显示 0 个字节。通过确保 qpid-proton 创建的消息正文使用二进制“数据”类型,我能够解决此问题。我没有在 Python 中尝试过,但这是 C++ 代码的样子。
proton::message msg;
std::string bodyString = "Hello World!";
proton::binary bodyBinary(bodyString.begin(), bodyString.end());
msg.body(bodyBinary);
在 Python 中,我会尝试确保消息正文具有“字节”数据类型,看看是否有效。