Scelta di un codificatore di messaggiChoosing a Message Encoder

In questo argomento vengono descritti i criteri per la scelta tra i codificatori di messaggi che sono inclusi in Windows Communication Foundation (WCF): binario, testo e Message Transmission Optimization Mechanism (MTOM).This topic discusses criteria for choosing among the message encoders that are included in Windows Communication Foundation (WCF): binary, text, and Message Transmission Optimization Mechanism (MTOM).

In WCF, specificare come trasferire i dati attraverso una rete tra endpoint per mezzo di un associazione, che è costituito da una sequenza di elementi di associazione.In WCF, you specify how to transfer data across a network between endpoints by means of a binding, which is made up of a sequence of binding elements. Un codificatore di messaggi è rappresentato da un elemento di associazione di codifica dei messaggi nello stack dell'associazione.A message encoder is represented by a message encoding binding element in the binding stack. Un'associazione include elementi facoltativi binding 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.A binding includes optional protocol binding elements, such as a security binding element or reliable messaging binding element, a required message encoding binding element, and a required transport binding element.

L'elemento di associazione di codifica dei messaggi si trova sotto gli elementi facoltativi binding del protocollo e sopra l'elemento associazione del trasporto obbligatorio.The message encoding binding element sits below the optional protocol binding elements and above the required transport binding element. Sul lato in uscita, un codificatore di messaggi serializza Message in uscita e lo passa al trasporto.On the outgoing side, a message encoder serializes the outgoing Message and passes it to the transport. Sul lato in ingresso, un codificatore di messaggi riceve il formato serializzato di un Message dal trasporto e lo passa al livello di protocollo superiore, se presente. In caso contrario, lo passa all'applicazione.On the incoming side, a message encoder receives the serialized form of a Message from the transport and passes it to the higher protocol layer, if present, or to the application, if not.

In caso di connessione a un client o a un server preesistente, potrebbe non essere possibile scegliere una particolare codifica dei messaggi dato che questi devono essere codificati come previsto dall'altro lato.When connecting to a pre-existing client or server, you may not have a choice about using a particular message encoding since you need to encode your messages in a way that the other side is expecting. Tuttavia, se si sta scrivendo un servizio WCF, è possibile esporre il servizio tramite più endpoint, ognuno dei quali utilizza una diversa codifica dei messaggi.However, if you are writing an WCF service, you can expose your service through multiple endpoints, each using a different message encoding. In tal modo i client possono scegliere la migliore codifica per conversare con il servizio sull'endpoint, e possono avere la flessibilità di scegliere la migliore codifica per se stessi.This allows clients to choose the best encoding for talking to your service over the endpoint that is best for them, as well as giving your clients the flexibility to choose the encoding that is best for them. L'utilizzo di più endpoint consente anche di combinare i vantaggi di codifiche del messaggio diverse con altri elementi di associazione.Using multiple endpoints also allows you to combine the advantages of different message encodings with other binding elements.

Codificatori forniti dal sistemaSystem-Provided Encoders

WCF include tre codificatori di messaggi, che sono rappresentati dalle tre classi seguenti:WCF includes three message encoders, which are represented by the following three classes:

  • TextMessageEncodingBindingElement, il codificatore dei messaggi di testo, supporta codifica XML semplice e codifica SOAP.TextMessageEncodingBindingElement, the text message encoder, supports both plain XML encoding and SOAP encoding. La modalità di codifica XML semplice del codificatore dei messaggi di testo è chiamata POX (Plain Old XML) per distinguerla dalla codifica SOAP basata su testo.The plain XML encoding mode of the text message encoder is called "plain old XML" (POX) to distinguish it from text-based SOAP encoding. Per abilitare POX, impostare la proprietà MessageVersion su None.To enable POX, set the MessageVersion property to None. Utilizzare il codificatore di messaggi di testo per interoperare con endpoint non WCF.Use the text message encoder to interoperate with non-WCF endpoints.

  • BinaryMessageEncodingBindingElement, il codificatore di messaggi binario, utilizza un formato binario compresso è ottimizzata per WCF per la comunicazione WCF e pertanto non è interoperativo.BinaryMessageEncodingBindingElement, the binary message encoder, uses a compact binary format and is optimized for WCF to WCF communication, and hence is not interoperable. Questo è il codificatore ad alte prestazioni la maggior parte dei codificatori di WCF.This is also the most performant encoder of all the encoders WCF provides.

  • < System.ServiceModel.Channels.MTOMMessageEncodingBindingElement>, l'elemento di associazione, specifica la codifica dei caratteri e la versione dei messaggi per i messaggi utilizzando la codifica MTOM.< System.ServiceModel.Channels.MTOMMessageEncodingBindingElement>, the binding element, specifies the character encoding and message versioning for messages using MTOM encoding. MTOM è una tecnologia efficiente per la trasmissione di dati binari nei messaggi di WCF.MTOM is an efficient technology for transmitting binary data in WCF messages. Il codificatore MTOM cerca di creare un equilibrio tra efficienza e interoperabilità.The MTOM encoder attempts to create a balance between efficiency and interoperability. La codifica MTOM trasmette la maggior parte del codice XML in formato testo, ma ottimizza grandi blocchi di dati binari trasmettendoli senza introdurre modifiche e senza convertirli in formato testo.The MTOM encoding transmits most XML in textual form, but optimizes large blocks of binary data by transmitting them as-is, without conversion to text. In termini di efficienza, tra i codificatori di WCF, MTOM è testo intermedi (il più lento) e binary (il più veloce).In terms of efficiency, among the encoders WCF provides, MTOM is in-between text (the slowest) and binary (the fastest).

Come scegliere un codificatore di messaggiHow to Choose a Message Encoder

Nella tabella seguente vengono descritti i fattori comuni utilizzati per scegliere un codificatore di messaggi.The following table describes common factors used to choose a message encoder. Dare la priorità ai fattori che sono importanti per l'applicazione, quindi scegliere i codificatori più efficienti per tali fattori.Prioritize the factors that are important for your application, and then choose the message encoders that work best with these factors. Tenere anche conto di eventuali fattori aggiuntivi non elencati in questa tabella e qualsiasi codificatore di messaggi personalizzato che può essere richiesto nell'applicazione.Be sure to consider any additional factors not listed in this table and any custom message encoders that may be required in your application.

FattoreFactor DescrizioneDescription Codificatori che supportano questo fattoreEncoders that support this factor
Set di caratteri supportatiSupported Character Sets TextMessageEncodingBindingElement e < System.ServiceModel.Channels.MTOMMessageEncodingBindingElement> supporta solo il Unicode UTF8 e UTF16 (big-endian e little-endian) codifiche.TextMessageEncodingBindingElement and < System.ServiceModel.Channels.MTOMMessageEncodingBindingElement> support only the UTF8 and UTF16 Unicode (big-endian and little-endian) encodings. Se sono richieste altre codifiche, ad esempio UTF7 o ASCII, deve essere utilizzato un codificatore personalizzato.If other encodings are required, such as UTF7 or ASCII, a custom encoder must be used. Per un codificatore personalizzato di esempio, vedere codificatore di messaggi personalizzato.For a sample custom encoder, see Custom Message Encoder. TestoText
IspezioneInspection L'ispezione è la capacità di esaminare i messaggi durante la trasmissione.Inspection is the ability to examine messages during transmission. Le codifiche di testo, con o senza l'utilizzo di SOAP, consentono a numerose applicazioni di ispezionare e analizzare i messaggi senza utilizzare strumenti specializzati.Text encodings, either with or without the use of SOAP, allow messages to be inspected and analyzed by many applications without the use of specialized tools. Si noti che l'utilizzo della sicurezza del trasferimento, a livello di messaggio o di trasporto, influisce sulla capacità di ispezionare i messaggi.Note that the use of transfer security, at either the message or transport level, affects your ability to inspect messages. La riservatezza evita che un messaggio venga esaminato, mentre l'integrità lo protegge dalle modifiche.Confidentiality protects a message from being examined and integrity protects a message from being modified. TestoText
AffidabilitàReliability L'affidabilità è la flessibilità di un codificatore nei confronti degli errori di trasmissione.Reliability is the resiliency of an encoder to transmission errors. L'affidabilità può essere fornita anche a livello di messaggio, trasporto o applicazione.Reliability can also be provided at the message, transport, or application layer. Tutti i codificatori WCF standard si presuppone che un altro livello stia fornendo l'affidabilità.All of the standard WCF encoders assume that another layer is providing reliability. Il codificatore non ha grandi capacità di recupero da un errore di trasmissione.The encoder has little ability to recover from a transmission error. NessunoNone
SemplicitàSimplicity La semplicità rappresenta la facilità con cui è possibile creare codificatori e decodificatori per una specifica di codifica.Simplicity represents the ease with which you can create encoders and decoders for an encoding specification. Le codifiche di testo sono particolarmente vantaggiose per la semplicità. La codifica di testo POX, inoltre, ha anche il vantaggio che non richiede supporto per l'elaborazione di SOAP.Text encodings are particularly advantageous for simplicity, and the POX text encoding has the additional advantage of not requiring support for processing SOAP. Testo (POX)Text (POX)
DimensioniSize La codifica determina la quantità di sovraccarico imposto sul contenuto.The encoding determines the amount of overhead imposed on content. La dimensione dei messaggi codificati è direttamente correlata alla velocità effettiva massima delle operazioni del servizio.The size of encoded messages is directly related to the maximum throughput of service operations. Le codifiche binarie in genere sono più compatte di quelle di testo.Binary encodings are generally more compact than text encodings. Quando la dimensione del messaggio è importante, prendere in considerazione anche la compressione del contenuto del messaggio durante la codifica.When message size is at a premium, consider also compressing the message contents during encoding. La compressione aumenta tuttavia gli oneri di elaborazione sia per il mittente che per il destinatario del messaggio.However, compression adds processing costs for both the message sender and receiver. BinarioBinary
FlussoStreaming Il flusso consente alle applicazioni di iniziare a elaborare un messaggio prima che sia arrivato tutto.Streaming allows applications to begin processing a message before the entire message has arrived. Per utilizzare in modo efficiente un flusso, è necessario che i dati importanti di un messaggio siano disponibili all'inizio del messaggio, affinché l'applicazione ricevente non debba attenderne l'arrivo.Effectively using streaming requires that the important data for a message be available at the beginning of the message so that the receiving application is not required to wait for it to arrive. Le applicazioni che utilizzano il trasferimento tramite flussi, inoltre, devono organizzare i dati nel messaggio in modo incrementale affinché il contenuto non abbia dipendenze in avanti.Moreover, applications that use streamed transfer must organize data in the message incrementally so that the content does not have forward dependencies. In molti casi, è necessario trovare un compromesso tra l'utilizzo di un flusso e la riduzione massima delle dimensioni di trasferimento di quel contenuto.In many cases, you must compromise between streaming content and having the smallest possible transfer size for that content. NessunoNone
Supporto di strumenti di terze parti3rd Party Tool Support Le aree di supporto per una codifica comprendono sviluppo e diagnosi.Support areas for an encoding include development and diagnosis. Gli sviluppatori di terze parti hanno investito massicciamente in librerie e toolkit per la gestione dei messaggi codificati nel formato POX.Third-party developers have made a large investment in libraries and toolkits for handling messages encoded in the POX format. Testo (POX)Text (POX)
InteroperabilitàInteroperability Questo fattore si riferisce alla capacità di un codificatore di WCF per interagire con i servizi non WCF.This factor refers to the ability of a WCF encoder to interoperate with non-WCF services. TestoText

MTOM (parziale)MTOM (partial)

Nota: quando si utilizza il codificatore binario, l'utilizzo dell'impostazione IgnoreWhitespace durante la creazione di un elemento XMLReader non avrà effetto.Note: When using the Binary Encoder, using the IgnoreWhitespace setting when creating a XMLReader will have no effect. Ad esempio, se si effettua quanto riportato di seguito in un'operazione del servizio:For example, if you do the following inside a service operation:

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.The IgnoreWhitespace setting is ignored.

Compressione e codificatore binarioCompression and the Binary Encoder

A partire da WCF 4.5, il codificatore binario WCF aggiunge il supporto per la compressione.Beginning with WCF 4.5 the WCF binary encoder adds support for compression. Questo consente di utilizzare l'algoritmo gzip/deflate per inviare messaggi compressi da un client WCF, nonché rispondere con messaggi compressi da un servizio WCF self-hosted.This enables you to use the gzip/deflate algorithm for sending compressed messages from a WCF client and also respond with compressed messages from a self-hosted WCF service. Questa funzionalità consente la compressione sui trasporti TCP e HTTP.This feature enables compression on both the HTTP and TCP transports. Un servizio WCF ospitato da IIS può sempre essere abilitato per l'invio di risposte compresse configurando il server host di IIS.An IIS hosted WCF service can always be enabled for sending compressed responses by configuring the IIS host server. Il tipo di compressione è configurato con la proprietà BinaryMessageEncodingBindingElement.CompressionFormat.The type of compression is configured with the BinaryMessageEncodingBindingElement.CompressionFormat property. Questa proprietà è impostata su uno dei valori dell'enumerazione System.ServiceModel.Channels.CompressionFormat:This property is set to one of the System.ServiceModel.Channels.CompressionFormat enum values:

  • CompressionFormat.Deflate
  • CompressionFormat.GZip
  • CompressionFormat.None

Poiché questa proprietà viene esposta solo su binaryMessageEncodingBindingElement, sarà necessario creare un'associazione personalizzata simile al seguente per utilizzare questa funzionalità:Since this property is only exposed on the binaryMessageEncodingBindingElement, you will need to create a custom binding like the following to use this feature:

<customBinding>
  <binding name="BinaryCompressionBinding">
    <binaryMessageEncoding compressionFormat ="GZip" />
    <httpTransport />
 </binding>
</customBinding>

Sia il client e il servizio è necessario accettare per inviare e ricevere messaggi compressi e pertanto la proprietà compressionFormat deve essere configurata sull'elemento binaryMessageEncoding sul client e servizio.Both the client and the service need to agree to send and receive compressed messages and therefore the compressionFormat property must be configured on the binaryMessageEncoding element on both client and service. Viene generata un'eccezione ProtocolException se per la compressione è configurato un solo lato, vale a dire o il servizio o il client. Pertanto, è necessario considerare con attenzione l'abilitazione della compressione.A ProtocolException is thrown if either the service or client is not configured for compression but the other side is.Enabling compression should be carefully considered. La compressione è particolarmente utile se la larghezza di banda della rete costituisce un collo di bottiglia.Compression is mostly useful if network bandwidth is a bottleneck. Nel caso in cui la CPU sia un collo di bottiglia, la compressione diminuirà la velocità effettiva.In the case where the CPU is the bottleneck, compression will decrease throughput. È necessario effettuare prove appropriate in un ambiente simulato per verificare eventuali vantaggi per l'applicazioneAppropriate testing must be done in a simulated environment to find out if this benefits the application

Vedere ancheSee Also

AssociazioniBindings