你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
消息标头和属性
本部分介绍消息标头和属性。
消息标头
发送消息时,你可以指定以下消息属性。 如果发送或接收了单个消息,则这些属性将包含在采用 JSON 编码格式的 BrokerProperties HTTP 标头中。 如果发送了一批消息,则这些属性将包含在 JSON 编码的 HTTP 正文中。 有关详细信息,请参阅 发送消息 和 发送消息批处理。
下表列出了 Microsoft.ServiceBus.Messaging.BrokeredMessage 属性。 这些属性可按任意顺序显示。 如果未指定属性,服务总线将使用该属性的默认值。 表中未列出的代理属性将被忽略。 接受的属性与指定 api-version 的值无关。 HTTP 请求中不需要 api-version 说明符。
如果同时设置 SessionId 和 PartitionKey 属性,则必须将它们设置为相同的值。
一个名为 BrokerProperties
的 HTTP 标头包含所有 BrokeredMessage
标头。 这些属性为 JSON 格式。 这样更易于扩展 BrokeredMessage
属性。 此外,它还利用 Web 友好 JSON 格式根据 Web 编程模型进行调整。 这样更易于在使用较少字符串解析的情况下生成和使用消息属性。 以下是 BrokeredMessage
标头的示例:
BrokerProperties: { “SessionId”: “{27729E1-B37B-4D29-AA0A-E367906C206E}”, “MessageId”: “{701332E1-B37B-4D29-AA0A-E367906C206E}”, “TimeToLive” : 90, “CorrelationId”: “{701332F3-B37B-4D29-AA0A-E367906C206E}”, “SequenceNumber“ : 12345, “DeliveryCount“ : 2, “To“ : "http://contoso.com“, “ReplyTo“ : "http://fabrikam.com“, "EnqueuedTimeUtc“ : " Sun, 06 Nov 1994 08:49:37 GMT“, "ScheduledEnqueueTimeUtc“ : " Sun, 06 Nov 1994 08:49:37 GMT“}
下表说明了如何将 BrokeredMessage
属性映射到 HTTP 标头。
BrokeredMessage (SBMP) 部分 |
类型 | HTTP 标头 | 可访问性 | HTTP 请求/响应 |
---|---|---|---|---|
ContentType | 字符串 | Content-Type | get、set | 请求、响应 |
CorrelationId | 字符串 | BrokerProperties{CorrelationId} | get、set | 请求、响应 |
SessionID | 字符串 | BrokerProperties {SessionId} | get、set | 请求、响应 |
DeliveryCount | int | BrokerProperties {DeliveryCount } | get | 响应 |
LockedUntilUtc | DateTime | BrokerProperties{LockedUntil} | get | 响应 |
LockToken | Guid | BrokerProperties{LockToken} | get | 响应 |
MessageId | 字符串 | BrokerProperties{MessageId} | get、set | 响应 |
Label | 字符串 | BrokerProperties {Label} | get、set | 请求、响应 |
ReplyTo | 字符串 | BrokerProperties {ReplyTo} | get、set | 请求、响应 |
EnqueuedTimeUtc | DateTime | 日期 | get | 响应 |
SequenceNumber | long | BrokerProperties {SequenceNumber} | get | 响应 |
TimeToLive | TimeSpan | BrokerProperties collection {TimeToLive} | get、set | 请求、响应 |
功能 | 字符串 | BrokerProperties {To} | get、set | 请求、响应 |
ScheduledEnqueueTimeUtc | DateTime | BrokerProperties {ScheduledEnqueueTimeUtc} | get、set | 请求、响应 |
ReplyToSessionId | 字符串 | BrokerProperties {ReplyToSessionId} | get、set | 请求、响应 |
PartitionKey | 字符串 | BrokerProperties {PartitionKey} | get、set | 请求、响应 |
除了这些属性外,你还可以指定自定义属性。 如果发送或接收了单个消息,则会将每个自定义属性放置在其自身的 HTTP 标头中。 如果发送了一批消息,则会将自定义属性包含在 JSON 编码的 HTTP 正文中。 有关详细信息,请参阅 发送消息 和 发送消息批处理。
说明
DateTime
标头的格式由 RFC2616 定义: https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3。 例如,“Sun, 06 Nov 1994 08:49:37 GMT”。BrokerProperties {TimeToLive} 是 TimeSpan (double) 的秒数。
ExpiresAtUtc
没有相应的 HTTP 标头,因为该标头可以从Date
和BrokerProperties {TimeToLive}
派生。具有 get 取值函数的消息标头只能出现在 HTTP 响应(例如,收到的消息)中。 当 HTTP 请求(即发送的消息)中存在这些标头时,系统会在不提示的情况下将其忽略。 无法识别的 HTTP 标头也会在无提示的情况下被忽略。
如果值的格式不正确,则会将相应的 HTTP 状态代码返回客户端。
消息属性
消息属性是包含在 message.Properties
中的用户定义的键值对。 对于 SBMP 胖客户端,值仅限于 byte
、sbyte
、char
、short
、ushort
、int
、uint
、long
、ulong
、float
、double
、decimal
、bool
、Guid
、string
、Uri
、DateTime
、DateTimeOffset
和 TimeSpan
。
对于 REST/HTTP,则不支持 Uri
和 DateTimeOffset
(如果它们在 BrokeredMessage
中,则不会将它们包含在 HTTP 标头中)。 GUID 类型将转换为字符串,而 TimeSpan
类型将转换为“总秒数”。 由于存在这些转换,将失去类型保真度。 此外,还将排除与受限制 HTTP 标头(例如,Connection
、Expect
,等等)对应的任何属性名称。
中的每个 message.Properties
键值对都将映射到采用以下格式的 HTTP 标头。
prop
是键名称, value
是值的字符串表示形式:
prop_name: value
可推断出值的类型。 如果将其用双引号括起来,则:
如果内容为 RFC2616 日期时间格式,则代理会将其视为
System.DateTime
。否则,代理会删除引号并将内容视为
System.String
。
如果没有将其用双引号括起来,则:
如果内容为 true 或 false(区分大小写!),则代理会将其视为具有对应值的
System.Boolean
。如果内容可以解析为整数,则代理会将其视为 System.Int64。
如果内容可以解析为浮点数,则代理会将其视为
System.Double
。否则,代理会拒绝该消息。
例如:
product: Windows 7 Ultimate
price: 299.98
order-time: Fri, 04 Mar 2011 08:49:37 GMT
邮件正文
HTTP 请求/响应正文流和 BrokerMessage.BodyStream
之间不进行任何转换。 另外,HTTP 请求的 Content-Type
标头将保留并返回给消息接收方,这样才能让应用程序正确解释正文中的字节信息。
如果使用 SBMP 胖客户端创建消息时没有使用自定义 xml 对象序列化程序,则内容类型将默认为“application/msbin1”(即 DataContractBinarySerializer
),除非在创建消息后应用程序显式更改它(例如,message.ContectType=”application/mytype”
)。 此内容类型值将返回给 HTTP 使用者。 由应用程序负责决定如何反序列化正文中的字节。
WCF 服务总线绑定将 ContentType
设置为消息编码器的 ContentType
。 例如,如果使用文本消息编码器,则 Content-Type
应为 “application/soap+xml”
。
消息转换
HTTP 请求/响应和消息之间的转换在 HTTP 消息传送运行时提供程序中执行。 将增强转换方法,使之包括本节前面介绍的表中的标头/属性映射,以便保留消息的内容类型。