旧版 WindowsAzure.ServiceBus 库的 AMQP 兼容性

注意

本文为迁移 WindowsAzure.ServiceBus 过程中现有应用提供了AMQP配置和序列化细节。 使用 迁移指南 迁移到受支持的 Azure.Messaging.ServiceBus 库。

Important

Azure 服务总线 库 WindowsAzure.ServiceBus、Microsoft.Azure.ServiceBus 和 com.microsoft.azure:azure-servicebus 将于 2026 年 10 月 31 日在 Azure 中国停用。 在该日期之后,他们将不再获得官方支持或更新。 停用后,应用程序可以继续将这些库与 AMQP 配合使用,但应迁移到当前库,以继续接收安全更新和错误修复。

对于 服务总线,迁移到适用于 .NET 的 Azure.Messaging.ServiceBus 或适用于 Java 的 com.azure:azure-messaging-servicebus。 请参阅WindowsAzure.ServiceBus、Microsoft.Azure.ServiceBus和com.microsoft.azure:azure-servicebus的迁移指南。

SBMP也将于2026年10月31日在 Azure 中国停用。 使用 AMQP 进行 服务总线 消息传递。 对 WindowsAzure.ServiceBus 的 Azure WCF Relay 支持将继续,直至另行通知。 有关背景信息,请参阅全球退休公告。

WindowsAzure.ServiceBus默认为服务总线消息传送协议(SBMP)。 2.1及以后版本也提供AMQP 1.0。 在 Azure 中国于 2026 年 10 月 31 日停用 SBMP 后,明确选择 AMQP,以便继续使用此库。

若要使用 AMQP 1.0 而不是默认协议,需要对服务总线连接字符串进行显式配置,或者通过 TransportType 选项在客户端构造函数中进行配置。 除了此更改之外,在使用 AMQP 1.0 时应用程序代码基本保持不变。

使用 AMQP 时,有几项 API 功能不受支持。 这些不受支持的功能在行为差异部分列出。 在使用 AMQP 时,一些高级配置设置还具有不同的含义。

配置连接字符串以使用 AMQP 1.0

将 ;TransportType=Amqp 追加到连接字符串,指示客户端使用 AMQP 1.0 与服务总线建立连接。 例如,

Endpoint=sb://[namespace].servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[SAS key];TransportType=Amqp

其中 namespace 和 SAS key 是在创建服务总线命名空间时从 Azure 门户获取的。 有关详细信息,请参阅使用 Azure 门户创建服务总线命名空间。

基于 WebSockets 的 AMQP

若要通过 WebSocket 使用 AMQP,请在连接字符串中将 TransportType 设置为 AmqpWebSockets。 例如:Endpoint=sb://[namespace].servicebus.chinacloudapi.cn/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[SAS key];TransportType=AmqpWebSockets。

消息序列化

使用 SBMP 时,WindowsAzure.ServiceBus系统对 BrokeredMessage 的正文使用了 DataContractSerializer。 在AMQP中,库使用AMQP类型系统来表示消息体。 这种表示方式允许其他平台上的应用程序(例如使用 JMS 的 Java 应用程序)解释支持的正文类型。

构造 BrokeredMessage 实例时,可以提供 .NET 对象作为构造函数的参数以充当消息的正文。 对于可映射到 AMQP 基元类型的对象,正文序列化为 AMQP 数据类型。 如果该对象不能直接映射到 AMQP 基元类型(即,应用程序定义的自定义类型),则使用 DataContractSerializer序列化对象,并且已序列化的字节将在 AMQP 数据消息中发送。

为了便于使用非 .NET 客户端进行互操作,仅在消息的正文中使用可直接序列化为 AMQP 类型的 .NET 类型。 下表详细介绍了这些类型以及到 AMQP 类型系统的相应映射。

.NET 主体对象类型 映射的 AMQP 类型 AMQP 正文部分类型
bool 布尔值 AMQP 值
字节 ubyte AMQP 值
ushort ushort AMQP 值
uint uint AMQP 值
ulong ulong AMQP 值
sbyte 字节 AMQP 值
短 短 AMQP 值
int int AMQP 值
长整型 长整型 AMQP 值
float float AMQP 值
双精度浮点数 双精度浮点数 AMQP 值
十进制 decimal128 AMQP 值
字符型 字符型 AMQP 值
DateTime 时间戳 AMQP 值
Guid uuid AMQP 值
byte[] 二进制 AMQP 值
字符串 字符串 AMQP 值
System.Collections.IList 列表 AMQP 值:集合中包含的项只能是此表中定义的类型。
System.Array 数组 AMQP 值:集合中包含的项只能是此表中定义的类型。
System.Collections.IDictionary 映射 AMQP 值:集合中包含的项只能是此表中定义的项。注意:仅支持字符串键。
Uri 所述 string(请参阅下表) AMQP 值
DateTimeOffset 长描述(请参阅下表) AMQP 值
TimeSpan 描述为长整型(请参阅下文) AMQP 值
Stream 二进制 AMQP 数据(可能有多个)。 数据部分包含从流对象读取的原始字节。
其他对象 二进制 AMQP 数据(可能有多个)。 包含使用 DataContractSerializer 或应用程序提供的序列化程序的对象的已序列化二进制值。
.NET 类型 映射的 AMQP 描述类型 备注
Uri <type name="uri" class=restricted source="string"> <descriptor name="com.microsoft:uri" /></type> Uri.AbsoluteUri
DateTimeOffset <type name="datetime-offset" class=restricted source="long"> <descriptor name="com.microsoft:datetime-offset" /></type> DateTimeOffset.UtcTicks
TimeSpan <type name="timespan" class=restricted source="long"> <descriptor name="com.microsoft:timespan" /></type> TimeSpan.Ticks

行为差异

在将现有 WindowsAzure.ServiceBus 应用从 SBMP 迁移到 AMQP 时,请考虑以下差异:

  • 将忽略 OperationTimeout 属性。
  • MessageReceiver.Receive(TimeSpan.Zero) 是以 MessageReceiver.Receive(TimeSpan.FromSeconds(10)) 的形式实现的。
  • 通过锁定令牌完成消息只能由最初收到消息的消息接收方完成。

控制 AMQP 协议设置

.NET API 公开了几项设置以控制 AMQP 协议的行为:

后续步骤

准备好了解详细信息? 请访问以下链接: