訊息標頭和屬性

本節描述訊息標頭和屬性。

郵件標題

在傳送訊息時,您可以指定下列訊息屬性。 如果傳送或接收單一訊息,這些屬性將會以 JSON 編碼的格式包含在 BrokerProperties HTTP 標頭中。 如果傳送訊息批次,則這些屬性會成為 JSON 編碼 HTTP 本文的一部分。 如需詳細資訊,請參閱 傳送訊息傳送訊息批次

下表列出 Microsoft.ServiceBus.Messaging.BrokeredMessage 屬性。 這些屬性可以任何順序出現。 如果未指定屬性,服務匯流排會使用該屬性的預設值。 未在此列的代理人屬性會被忽略。 接受的屬性並不依存於指定的 api-version 值。 HTTP 要求中不一定要有 api-version 指定名稱。

如果同時設定了 SessionIdPartitionKey 屬性,兩者必須設為相同的值。

一個名稱為 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 標頭,因為它可以衍生自 DateBrokerProperties {TimeToLive}

  • 具有 get 存取子的訊息標頭只能出現在 HTTP 回應 (如接收的訊息) 中。 這些標頭出現在 HTTP 要求 (即傳送的訊息) 中時,則會自動予以忽略。 系統也會自動忽略無法識別的 HTTP 標頭。

  • 如果值的格式錯誤,則會將適當的 HTTP 狀態碼傳回給用戶端。

訊息屬性

訊息屬性是 message.Properties 中所含的使用者定義金鑰/值配對。 若為 SBMP Thick 用戶端,值僅限為 bytesbytecharshortushortintuintlongulongfloatdoubledecimalboolGuidstringUriDateTimeDateTimeOffsetTimeSpan

若為 REST/HTTP,不支援 UriDateTimeOffset (如果它們是在 BrokeredMessage 中,則不會包括在 HTTP 標頭中)。 GUID 類型會轉換為字串,而 TimeSpan 類型會轉換為「總秒數」。 因為這些轉換,將會遺失類型逼真度。 系統也會排除任何與受限 HTTP 標頭對應的屬性名稱 (例如,ConnectionExpect 等)。

中的每個 message.Properties 機碼/值組都會以下列格式對應至 HTTP 標頭。 prop 是索引鍵名稱,而 value 是值的字串表示:

prop_name: value  

值的類型是推論而來。 如果它是用雙引號括住,則:

  • 如果內容的形式為 RFC2616 日期時間,則 Broker 會將它視為 System.DateTime

  • 否則,Broker 會移除引號,並將內容視為 System.String

如果它不是用雙引號括住,則:

  1. 如果內容為 true 或 false (區分大小寫),則 Broker 會將它視為具有對應值的 System.Boolean

  2. 如果內容可以剖析為整數,則 Broker 會將它視為 System.Int64。

  3. 如果內容可以剖析為浮點數,則 Broker 會將它視為 System.Double

  4. 否則,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 訊息執行階段提供者執行。 轉換方法會增強以包括本節前面之表格中的標頭/屬性對應,以及保留訊息的內容類型。