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 daDate
eBrokerProperties {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:
Se il contenuto è true o false (con distinzione tra maiuscole e minuscole), il broker lo considera come
System.Boolean
con il valore corrispondente.Se il contenuto può essere analizzato come numero intero (integer), il broker lo considera come System.Int64.
Se il contenuto può essere analizzato come numero a virgola mobile, il broker lo considera come
System.Double
.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 ContentType
messaggi . 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.