Intestazioni e proprietà dei messaggi

Questa sezione illustra le intestazioni e le proprietà dei messaggi.

Intestazioni del messaggio

Quando si invia un messaggio, è possibile specificare le proprietà seguenti del messaggio. Se si invia o si riceve un singolo messaggi, queste proprietà si troveranno nell'intestazione HTTP BrokerProperties in un formato con codifica JSON. Se si invia un batch di messaggi, queste proprietà faranno parte del corpo HTTP con codifica JSON. Per altre informazioni, vedere Send Message and Send Message Batch.For more information, see Send Message and Send Message Batch.

Nella tabella seguente sono elencate le proprietà Microsoft.ServiceBus.Messaging.BrokeredMessage . Le proprietà possono essere visualizzate in qualsiasi ordine. Se non viene specificata una proprietà, il bus di servizio usa il valore predefinito per tale proprietà. Le proprietà broker diverse da quelle elencate saranno ignorate. Le proprietà accettate sono indipendenti dal valore di api-version specificato. L'identificatore api-version non è obbligatorio nella richiesta HTTP.

Se entrambe le proprietà SessionId e PartitionKey sono state impostate, è necessario che siano impostate sullo stesso valore.

In un'intestazione HTTP denominata BrokerProperties sono contenute tutte le intestazioni BrokeredMessage. Le proprietà sono in formato JSON, pertanto è più facile estendere le proprietà BrokeredMessage e allinearsi al modello di programmazione Web sfruttando il formato JSON adatto per il Web. È inoltre più facile produrre e usare proprietà dei messaggi con meno attività di analisi delle stringhe. Di seguito è riportato un esempio di intestazioni 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“}  

La seguente tabella illustra come le proprietà BrokeredMessage sono mappate alle intestazioni HTTP.

Parti di BrokeredMessage (SBMP) Tipo Intestazione HTTP Accessibilità Req/Res HTTP
ContentType string Content-Type get, set Req, Res
CorrelationId string 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
Etichetta string BrokerProperties {Label} get, set Req, Res
ReplyTo string BrokerProperties {ReplyTo} get, set Req, Res
EnqueuedTimeUtc DataOra Data get Res
SequenceNumber long BrokerProperties {SequenceNumber} get Res
timeToLive TimeSpan BrokerProperties collection {TimeToLive} get, set Req, Res
Per 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

Oltre a queste proprietà, è possibile specificare proprietà personalizzate. Se si invia o si riceve un singolo messaggio, ogni proprietà personalizzata sarà posizionata in un'intestazione HTTP specifica. Se si invia un batch di messaggi, le proprietà personalizzate faranno parte del corpo HTTP con codifica JSON. Per altre informazioni, vedere Send Message and Send Message Batch.For more information, see Send Message Batch.For more information, see Send Message And Send Message Batch.

Note

  • DateTime le intestazioni vengono formattate come definite da RFC2616: https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3. Ad esempio, "Sun, 06 Nov 1994 08:49:37 GMT".

  • BrokerProperties {TimeToLive} è il numero di secondi di TimeSpan (double).

  • ExpiresAtUtc non ha un'intestazione HTTP corrispondente perché può derivare da Date e BrokerProperties {TimeToLive}.

  • Le intestazioni dei messaggi con una funzione di accesso get possono essere presenti solo nella risposta HTTP, ad esempio nel messaggio ricevuto. Quando queste intestazioni sono presenti nella richiesta (Req) HTTP, ovvero nel messaggio inviato, vengono ignorate in modo invisibile, così come avviene anche per le intestazioni HTTP non riconosciute.

  • Se il valore non è nel formato corretto, al client viene restituito un codice di stato HTTP appropriato.

Proprietà del messaggio

Le proprietà dei messaggi sono coppie chiave-valore definite dall'utente contenute in message.Properties. Per il thick client SBMP, i valori possono essere solo di tipo byte, sbyte, char, short, ushort, int, uint, long, ulong, float, double, decimal, bool, Guid, string, Uri, DateTime, DateTimeOffset e TimeSpan.

Per REST/HTTP, Uri e DateTimeOffset non sono supportati (se sono presenti in BrokeredMessage, non vengono inclusi nelle intestazioni HTTP). I tipi GUID vengono convertiti in stringhe e i tipi TimeSpan vengono convertiti in "secondi totali". A causa di queste conversioni, si perde la fedeltà dei tipi. Viene escluso anche qualsiasi nome di proprietà corrispondente all'intestazione HTTP con restrizioni, ad esempio Connection, Expect e così via.

Ogni coppia chiave-valore in message.Properties verrà mappata a un'intestazione HTTP nel formato seguente. prop è il nome della chiave e value rappresenta la rappresentazione stringa del valore:

prop_name: value  

Il tipo di valore viene dedotto. Se è delimitato da virgolette, accade quanto segue:

  • Se il contenuto ha il formato di una data/ora RFC2616, il broker lo considera come System.DateTime.

  • In caso contrario, il broker rimuove le virgolette e considera il contenuto come System.String.

Se non è delimitato da virgolette, accade quanto segue:

  1. Se il contenuto è true o false (con distinzione tra maiuscole e minuscole), il broker lo considera come System.Boolean con il valore corrispondente.

  2. Se il contenuto può essere analizzato come numero intero (integer), il broker lo considera come System.Int64.

  3. Se il contenuto può essere analizzato come numero a virgola mobile, il broker lo considera come System.Double.

  4. In caso contrario, il broker rifiuta il messaggio.

Ad esempio:

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

Corpo del messaggio

Non viene eseguita alcuna conversione tra il flusso del corpo delle richieste/risposte HTTP e BrokerMessage.BodyStream. L'intestazione Content-Type della richiesta HTTP inoltre viene mantenuta e restituita al ricevitore del messaggio per consentire all'applicazione di interpretare correttamente i byte nel corpo.

Se il messaggio viene creato con il thick client SBMP senza un serializzatore di oggetti XML personalizzato, per impostazione predefinita come tipo di contenuto verrà usato "application/msbin1", che corrisponde a DataContractBinarySerializer, a meno che l'applicazione non lo modifichi esplicitamente (ad esempio, come message.ContectType=”application/mytype”) dopo la creazione del messaggio. Questo valore del tipo di contenuto viene restituito al consumer HTTP. Spetta all'applicazione decidere come deserializzare i byte nel corpo.

L'associazione del bus di servizio WCF imposta l'oggetto ContentType sul codificatore di ContentTypemessaggi . Se ad esempio viene usato un codificatore di messaggi di testo, Content-Type sarà “application/soap+xml”.

Conversione dei messaggi

La conversione tra una richiesta/risposta HTTP e un messaggio viene eseguita nel provider di runtime della messaggistica HTTP. I metodi di conversione vengono aumentati in modo da includere il mapping intestazione/proprietà della precedente tabella in questa sezione e per mantenere il tipo di contenuto del messaggio.