Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra i criteri per la scelta tra i codificatori di messaggi inclusi in Windows Communication Foundation (WCF): binary, text e Message Transmission Optimization Mechanism (MTOM).
In WCF si specifica come trasferire i dati in una rete tra endpoint tramite un'associazione, costituita da una sequenza di elementi di associazione. Un codificatore di messaggi è rappresentato da un elemento di associazione di codifica dei messaggi nello stack di binding. Un'associazione include elementi facoltativi di associazione del protocollo, ad esempio un elemento di associazione di sicurezza o un elemento di associazione di messaggistica affidabile, un elemento di associazione di codifica dei messaggi obbligatorio e un elemento di associazione di trasporto obbligatorio.
L'elemento di associazione di codifica dei messaggi si trova sotto gli elementi di associazione del protocollo facoltativi e sopra l'elemento di associazione di trasporto richiesto. Sul lato in uscita, un encoder di messaggi serializza l'elemento in uscita Message e lo invia al sistema di trasporto. Sul lato in ingresso, un codificatore di messaggi riceve la forma serializzata di un Message oggetto dal trasporto e lo passa al livello di protocollo superiore, se presente o all'applicazione, in caso contrario.
Quando ci si connette a un client o a un server preesistente, potrebbe non essere possibile scegliere di usare una particolare codifica dei messaggi perché è necessario codificare i messaggi in modo che l'altro lato si aspetta. Tuttavia, se si scrive un servizio WCF, è possibile esporre il servizio tramite più endpoint, ognuno usando una codifica di messaggi diversa. In questo modo, i client possono scegliere la codifica migliore per comunicare con il servizio sull'endpoint più adatto, oltre a offrire ai client la flessibilità necessaria per scegliere la codifica più adatta. L'uso di più endpoint consente anche di combinare i vantaggi delle diverse codifiche dei messaggi con altri elementi di associazione.
codificatori System-Provided
WCF include tre codificatori di messaggi, rappresentati dalle tre classi seguenti:
TextMessageEncodingBindingElement, il codificatore di messaggi di testo supporta sia la codifica XML normale che la codifica SOAP. La modalità di codifica XML normale del codificatore di messaggi di testo è denominata "XML normale" (POX) per distinguerla dalla codifica SOAP basata su testo. Per abilitare POX, impostare la MessageVersion proprietà su None. Usare il codificatore di messaggi di testo per interagire con endpoint non WCF.
BinaryMessageEncodingBindingElement, il codificatore di messaggi binari, usa un formato binario compatto ed è ottimizzato per la comunicazione WCF a WCF e pertanto non è interoperabile. Si tratta anche del codificatore più efficiente di tutti i codificatori forniti da WCF.
MtomMessageEncodingBindingElement, l'elemento di associazione, specifica la codifica dei caratteri e il controllo delle versioni dei messaggi per i messaggi tramite la codifica MTOM. MTOM è una tecnologia efficiente per la trasmissione di dati binari nei messaggi WCF. Il codificatore MTOM tenta di creare un equilibrio tra efficienza e interoperabilità. La codifica MTOM trasmette la maggior parte dei dati XML in formato testuale, ma ottimizza grandi blocchi di dati binari trasmettendoli as-is, senza conversione in testo. In termini di efficienza, tra i codificatori WCF fornisce, MTOM è tra testo (il più lento) e binario (il più veloce).
Come scegliere un codificatore di messaggi
Nella tabella seguente vengono descritti i fattori comuni usati per scegliere un codificatore di messaggi. Classificare in ordine di priorità i fattori importanti per l'applicazione e quindi scegliere i codificatori di messaggi che funzionano meglio con questi fattori. Assicurarsi di considerare eventuali fattori aggiuntivi non elencati in questa tabella e eventuali codificatori di messaggi personalizzati che potrebbero essere necessari nell'applicazione.
Fattore | Descrizione | Codificatori che supportano questo fattore |
---|---|---|
Set di caratteri supportati | TextMessageEncodingBindingElement e MtomMessageEncodingBindingElement supportano solo le codifiche Unicode UTF8 e UTF16 (big-endian e little-endian). Se sono necessarie altre codifiche, ad esempio UTF7 o ASCII, è necessario usare un codificatore personalizzato. Per un codificatore personalizzato di esempio, vedere Codificatore messaggi personalizzato. | Testo |
Ispezione | L'ispezione è la possibilità di esaminare i messaggi durante la trasmissione. Le codifiche di testo, con o senza l'uso di SOAP, consentono di esaminare e analizzare i messaggi da parte di molte applicazioni senza l'uso di strumenti specializzati. L'uso della sicurezza del trasferimento, a livello di messaggio o trasporto, influisce sulla capacità di esaminare i messaggi. La riservatezza protegge un messaggio dall'esame e dall'integrità protegge un messaggio dall'essere modificato. | Testo |
Affidabilità | L'affidabilità è la resilienza di un codificatore agli errori di trasmissione. L'affidabilità può essere fornita anche a livello di messaggio, trasporto o applicazione. Tutti i codificatori WCF standard presuppongono che un altro livello fornisca affidabilità. Il codificatore ha poca capacità di recuperare da un errore di trasmissione. | Nessuno |
Semplicità | Semplicità rappresenta la facilità con cui è possibile creare codificatori e decodificatori per una specifica di codifica. Le codifiche di testo sono particolarmente vantaggiose per semplicità e la codifica del testo POX offre il vantaggio aggiuntivo di non richiedere il supporto per l'elaborazione soap. | Testo (POX) |
Misura | La codifica determina la quantità di sovraccarico imposta al contenuto. Le dimensioni dei messaggi codificati sono direttamente correlate alla velocità effettiva massima delle operazioni del servizio. Le codifiche binarie sono in genere più compatta rispetto alle codifiche di testo. Quando lo spazio del messaggio è limitato, è opportuno considerare di comprimere il contenuto del messaggio durante la codifica. Tuttavia, la compressione aggiunge costi di elaborazione sia per il mittente del messaggio che per il destinatario. | Binario |
Trasmissione in diretta | Lo streaming consente alle applicazioni di iniziare l'elaborazione di un messaggio prima dell'arrivo dell'intero messaggio. L'uso efficace dello streaming richiede che i dati importanti per un messaggio siano disponibili all'inizio del messaggio, in modo che l'applicazione ricevente non sia costretta ad attendere che i dati arrivino. Inoltre, le applicazioni che usano il trasferimento in flusso devono organizzare i dati nel messaggio in modo incrementale in modo che il contenuto non abbia dipendenze inoltrate. In molti casi, è necessario trovare un compromesso tra lo streaming del contenuto e avere la dimensione di trasferimento più piccola possibile per tale contenuto. | Nessuno |
Supporto di strumenti di terze parti | Le aree di supporto per una codifica includono sviluppo e diagnosi. Gli sviluppatori di terze parti hanno effettuato un grande investimento in librerie e toolkit per la gestione dei messaggi codificati nel formato POX. | Testo (POX) |
Interoperabilità | Questo fattore si riferisce alla capacità di un codificatore WCF di interagire con i servizi non WCF. | Testo MTOM (parziale) |
Nota: quando si usa il codificatore binario, l'impostazione IgnoreWhitespace durante la creazione di un xmlReader non avrà alcun effetto. Ad esempio, se si eseguono le operazioni seguenti all'interno di un'operazione del servizio:
public void OperationContract(XElement input)
{
Console.WriteLine("{0}", input.Value);
int counter = 0;
var xreader = input.CreateReader();
var reader = XmlReader.Create(xreader, new XmlReaderSettings() { IgnoreWhitespace = true });
while (reader.Read())
{
counter++;
}
Console.WriteLine("Read {0} lines with reader", counter);
}
L'impostazione IgnoreWhitespace viene ignorata.
Compressione e codificatore binario
A partire da WCF 4.5, il codificatore binario WCF aggiunge il supporto per la compressione. In questo modo è possibile usare l'algoritmo gzip/deflate per l'invio di messaggi compressi da un client WCF e rispondere anche con messaggi compressi da un servizio WCF self-hosted. Questa funzionalità abilita la compressione nei trasporti HTTP e TCP. Un servizio WCF ospitato in IIS può sempre essere abilitato per l'invio di risposte compresse configurando il server host IIS. Il tipo di compressione viene configurato con la BinaryMessageEncodingBindingElement.CompressionFormat proprietà . Questa proprietà è impostata su uno dei valori dell'enum System.ServiceModel.Channels.CompressionFormat.
Poiché questa proprietà è esposta solo in binaryMessageEncodingBindingElement, è necessario creare un'associazione personalizzata come la seguente per usare questa funzionalità:
<customBinding>
<binding name="BinaryCompressionBinding">
<binaryMessageEncoding compressionFormat ="GZip" />
<httpTransport />
</binding>
</customBinding>
Sia il client che il servizio devono accettare di inviare e ricevere messaggi compressi e pertanto la proprietà compressionFormat deve essere configurata nell'elemento binaryMessageEncoding sia nel client che nel servizio. Viene lanciata un'eccezione ProtocolException se il servizio o il client non è configurato per la compressione, mentre l'altra parte lo è. L'abilitazione della compressione deve essere presa in considerazione attentamente. La compressione è particolarmente utile se la larghezza di banda di rete è un collo di bottiglia. Nel caso in cui la CPU sia il collo di bottiglia, la compressione ridurrà la velocità effettiva. I test appropriati devono essere eseguiti in un ambiente simulato per scoprire se questo beneficia l'applicazione.