Заголовки и свойства сообщения

В этом разделе описываются заголовки и свойства сообщений.

Заголовки сообщений

При отправке сообщения ему можно задать следующие свойства. Если выполняется отправка или получение одного сообщения, эти свойства содержатся в заголовке HTTP BrokerProperties и закодированы в формате JSON. Если выполняется отправка пакета сообщений, эти свойства содержатся тексте HTTP, закодированном в формате JSON. Дополнительные сведения см. в разделах Отправка сообщения и Отправка пакета сообщений.

В следующей таблице перечислены свойства Microsoft.ServiceBus.Messaging.BrokeredMessage . Свойства могут отображаться в любом порядке. Если свойство не указано, служебная шина использует значение по умолчанию для этого свойства. Свойства посредника, отличные от указанных, игнорируются. Принятые свойства не зависят от значения спецификатора api-version. В запросе HTTP спецификатор api-version не требуется.

Если заданы оба свойства, SessionId и PartitionKey, они должны иметь одно и то же значение.

Один заголовок HTTP с именем BrokerProperties содержит все заголовки BrokeredMessage. Свойства имеют формат JSON. Это позволяет легко расширить свойства BrokeredMessage. Кроме того, он обеспечивает соответствие модели веб-программирования за счет использования формата JSON, удобного для такой модели. В результате облегчается создание и потребление свойств сообщения за счет уменьшения анализа синтаксиса строк. Ниже представлен пример заголовков 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.

Части (SBMP)BrokeredMessage Тип Заголовок HTTP Специальные возможности HTTP Req/Res
ContentType строка Content-Type get, set Req, Res
CorrelationId строка BrokerProperties{CorrelationId} get, set Req, Res
SessionID строка BrokerProperties {SessionId} get, set Req, Res
DeliveryCount INT BrokerProperties {DeliveryCount } get Res
LockedUntilUtc Дата и время BrokerProperties{LockedUntil} get Res
LockToken Guid BrokerProperties{LockToken} get Res
MessageId строка BrokerProperties{MessageId} get, set Res
Метка строка BrokerProperties {Label} get, set Req, Res
ReplyTo строка BrokerProperties {ReplyTo} get, set Req, Res
EnqueuedTimeUtc Дата/время Date get Res
SequenceNumber long BrokerProperties {SequenceNumber} get Res
timeToLive TimeSpan BrokerProperties collection {TimeToLive} get, set Req, Res
Кому строка BrokerProperties {To} get, set Req, Res
ScheduledEnqueueTimeUtc Дата и время BrokerProperties {ScheduledEnqueueTimeUtc} get, set Req, Res
ReplyToSessionId строка BrokerProperties {ReplyToSessionId} get, set Req, Res
PartitionKey строка BrokerProperties {PartitionKey} get, set Req, Res

Кроме этих свойств можно задать настраиваемые свойства. Если выполняется отправка или получение одного сообщения, каждое настраиваемое свойство помещается в собственный заголовок HTTP. Если выполняется отправка пакета сообщений, настраиваемые свойства содержатся тексте HTTP, закодированном в формате JSON. Дополнительные сведения см. в разделах Отправка сообщения и Отправка пакета сообщений.

Примечания

  • DateTime заголовки форматируются в соответствии с определением RFC2616: https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3. Например, понедельник, 6 ноября 1994 г., 08:49:37.

  • 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.

Если оно не окружено двойными кавычками, то:

  1. Если содержимое имеет значение true или false (с учетом регистра!), посредник воспринимает его как System.Boolean с соответствующим значением.

  2. Если содержимое может быть проанализировано как целое посредник воспринимает его как System.Int64.

  3. Если содержимое может быть проанализировано как число с плавающей запятой, посредник воспринимает его как System.Double.

  4. В противном случае, посредник отклоняет сообщение.

Пример:

product: Windows 7 Ultimate  
price: 299.98  
order-time: Fri, 04 Mar 2011 08:49:37 GMT  

Текст сообщения

Между потоком текста HTTP запроса/ответа и BrokerMessage.BodyStream не выполняется никаких преобразований. Кроме того, заголовок Content-Type из запроса HTTP сохраняется и возвращается получателю сообщения, позволяя приложению правильно интерпретировать байты в тексте.

Если сообщение создается с помощью толстого клиента SBMP без настраиваемого сериализатора объекта xml, тип содержимого принимает значение по умолчанию application/msbin1, которое является DataContractBinarySerializer, если только приложение явно не меняет его (например, message.ContectType=”application/mytype”) после создания сообщения. Значение типа содержимого возвращается потребителю HTTP. Далее приложение решает, как проводить десериализацию байтов в тексте.

Привязка служебной шины WCF задает значение ContentType для кодировщика ContentTypeсообщений. Например, если используется кодировщик текстовых сообщений, Content-Type должен быть “application/soap+xml”.

Преобразование сообщений

Преобразование между запросом/ ответом HTTP и сообщением выполняется в поставщике среды обмена сообщениями HTTP. Методы преобразования дополняются, чтобы включить сопоставление заголовка/свойств в таблице, указанной выше в этом разделе, а также сохранить тип содержимого сообщения.