訊息標頭和屬性
本節描述訊息標頭和屬性。
郵件標題
在傳送訊息時,您可以指定下列訊息屬性。 如果傳送或接收單一訊息,這些屬性將會以 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 | string | Content-Type | get, set | Req, Res |
CorrelationId | 字串 | BrokerProperties{CorrelationId} | get, set | Req, Res |
SessionID | string | BrokerProperties {SessionId} | get, set | Req, Res |
DeliveryCount | int | BrokerProperties {DeliveryCount } | get | Res |
LockedUntilUtc | Datetime | BrokerProperties{LockedUntil} | get | Res |
LockToken | Guid | BrokerProperties{LockToken} | get | Res |
MessageId | string | BrokerProperties{MessageId} | get, set | Res |
標籤 | string | BrokerProperties {Label} | get, set | Req, Res |
ReplyTo | string | BrokerProperties {ReplyTo} | get, set | Req, Res |
EnqueuedTimeUtc | DateTime | Date | get | Res |
SequenceNumber | long | BrokerProperties {SequenceNumber} | get | Res |
timeToLive | TimeSpan | BrokerProperties 集合 {TimeToLive} | get, set | Req, Res |
收件者 | string | BrokerProperties {To} | get, set | Req, Res |
ScheduledEnqueueTimeUtc | Datetime | BrokerProperties {ScheduledEnqueueTimeUtc} | get, set | Req, Res |
ReplyToSessionId | string | BrokerProperties {ReplyToSessionId} | get, set | Req, Res |
PartitionKey | string | BrokerProperties {PartitionKey} | get, set | Req, Res |
除了這些屬性以外,您也可以指定自訂屬性。 如果傳送或接收單一訊息,每個自訂屬性都將放在其本身的 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 Thick 用戶端,值僅限為 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 日期時間,則 Broker 會將它視為
System.DateTime
。否則,Broker 會移除引號,並將內容視為
System.String
。
如果它不是用雙引號括住,則:
如果內容為 true 或 false (區分大小寫),則 Broker 會將它視為具有對應值的
System.Boolean
。如果內容可以剖析為整數,則 Broker 會將它視為 System.Int64。
如果內容可以剖析為浮點數,則 Broker 會將它視為
System.Double
。否則,Broker 會拒絕訊息。
例如:
product: Windows 7 Ultimate
price: 299.98
order-time: Fri, 04 Mar 2011 08:49:37 GMT
訊息內文
HTTP 要求/回應內文串流與 BrokerMessage.BodyStream
之間不會進行轉換。 而且,HTTP 要求中的 Content-Type
標頭會保留並傳回給訊息接收者,允許應用程式正確解譯內文中的位元組。
如果訊息是使用沒有自訂 XML 物件序列化程式的 SBMP Thick 用戶端所建立,則除非應用程式在建立訊息之後明確地變更它 (例如,message.ContectType=”application/mytype”
),否則內容類型會預設為 "application/msbin1" (其為 DataContractBinarySerializer
)。 此內容類型值會傳回給 HTTP 消費者。 應用程式應負責決定如何還原序列化內文中的位元組。
WCF 服務匯流排系結會將 ContentType
設定為訊息編碼器的 ContentType
。 例如,如果使用文字訊息編碼器,Content-Type
應該要是 “application/soap+xml”
。
訊息轉換
HTTP 要求/回應與訊息之間的轉換是在 HTTP 訊息執行階段提供者執行。 轉換方法會增強以包括本節前面之表格中的標頭/屬性對應,以及保留訊息的內容類型。