Escolha um codificador de mensagens

Este artigo discute os critérios para escolher entre os codificadores de mensagem incluídos no Windows Communication Foundation (WCF): binário, texto e MTOM (Message Transmission Optimization Mechanism).

No WCF, você especifica como transferir dados através de uma rede entre pontos de extremidade por meio de uma ligação, que é composta por uma sequência de elementos de ligação. Um codificador de mensagem é representado por um elemento de vinculação de codificação de mensagem na pilha de vinculação. Uma associação inclui elementos de vinculação de protocolo opcionais, como um elemento de vinculação de segurança ou um elemento de vinculação de mensagens confiável, um elemento de vinculação de codificação de mensagem necessário e um elemento de vinculação de transporte necessário.

O elemento de vinculação de codificação de mensagem fica abaixo dos elementos de vinculação de protocolo opcionais e acima do elemento de vinculação de transporte necessário. No lado de saída, um codificador de mensagens serializa a saída Message e a passa para o transporte. No lado de entrada, um codificador de mensagens recebe a forma serializada de a Message do transporte e a passa para a camada de protocolo superior, se presente, ou para o aplicativo, se não.

Ao conectar-se a um cliente ou servidor pré-existente, você pode não ter a opção de usar uma codificação de mensagem específica, pois precisa codificar suas mensagens de uma maneira que o outro lado está esperando. No entanto, se você estiver escrevendo um serviço WCF, poderá expor seu serviço por meio de vários pontos de extremidade, cada um usando uma codificação de mensagem diferente. Isso permite que os clientes escolham a melhor codificação para falar com seu serviço em vez do ponto de extremidade que é melhor para eles, além de dar aos seus clientes a flexibilidade de escolher a codificação que é melhor para eles. O uso de vários pontos de extremidade também permite combinar as vantagens de diferentes codificações de mensagens com outros elementos de ligação.

Codificadores fornecidos pelo sistema

WCF inclui três codificadores de mensagem, que são representados pelas seguintes três classes:

  • TextMessageEncodingBindingElement, o codificador de mensagens de texto, suporta codificação XML simples e codificação SOAP. O modo de codificação XML simples do codificador de mensagem de texto é chamado de "XML antigo simples" (POX) para distingui-lo da codificação SOAP baseada em texto. Para habilitar o POX, defina a MessageVersion propriedade como None. Use o codificador de mensagem de texto para interoperar com pontos de extremidade não-WCF.

  • BinaryMessageEncodingBindingElement, o codificador de mensagens binárias, usa um formato binário compacto e é otimizado para comunicação WCF para WCF e, portanto, não é interoperável. Este também é o codificador de maior desempenho de todos os codificadores que o WCF fornece.

  • MtomMessageEncodingBindingElement, o elemento de ligação, especifica a codificação de caracteres e o controle de versão de mensagens para mensagens que usam codificação MTOM. MTOM é uma tecnologia eficiente para transmitir dados binários em mensagens WCF. O codificador MTOM tenta criar um equilíbrio entre eficiência e interoperabilidade. A codificação MTOM transmite a maioria dos XML em formato textual, mas otimiza grandes blocos de dados binários transmitindo-os como estão, sem conversão em texto. Em termos de eficiência, entre os codificadores que o WCF fornece, o MTOM está entre o texto (o mais lento) e o binário (o mais rápido).

Como escolher um codificador de mensagens

A tabela a seguir descreve os fatores comuns usados para escolher um codificador de mensagens. Priorize os fatores que são importantes para seu aplicativo e, em seguida, escolha os codificadores de mensagem que funcionam melhor com esses fatores. Certifique-se de considerar quaisquer fatores adicionais não listados nesta tabela e quaisquer codificadores de mensagens personalizados que possam ser necessários em seu aplicativo.

Fator Description Codificadores que suportam esse fator
Conjuntos de caracteres suportados TextMessageEncodingBindingElement e MtomMessageEncodingBindingElement suporta apenas as codificações UTF8 e UTF16 Unicode (big-endian e little-endian). Se outras codificações forem necessárias, como UTF7 ou ASCII, um codificador personalizado deverá ser usado. Para obter um exemplo de codificador personalizado, consulte Codificador de mensagem personalizado. Texto
Inspeção Inspeção é a capacidade de examinar mensagens durante a transmissão. As codificações de texto, com ou sem o uso de SOAP, permitem que as mensagens sejam inspecionadas e analisadas por muitos aplicativos sem o uso de ferramentas especializadas. O uso da segurança de transferência, tanto no nível da mensagem quanto do transporte, afeta sua capacidade de inspecionar mensagens. A confidencialidade protege uma mensagem de ser examinada e a integridade protege uma mensagem de ser modificada. Texto
Fiabilidade Confiabilidade é a resiliência de um codificador a erros de transmissão. A confiabilidade também pode ser fornecida na camada de mensagem, transporte ou aplicativo. Todos os codificadores WCF padrão assumem que outra camada está fornecendo confiabilidade. O codificador tem pouca capacidade de recuperar de um erro de transmissão. Nenhuma
Simplicidade A simplicidade representa a facilidade com que você pode criar codificadores e decodificadores para uma especificação de codificação. As codificações de texto são particularmente vantajosas para a simplicidade, e a codificação de texto POX tem a vantagem adicional de não exigir suporte para processar SOAP. Texto (POX)
Tamanho A codificação determina a quantidade de sobrecarga imposta ao conteúdo. O tamanho das mensagens codificadas está diretamente relacionado à taxa de transferência máxima das operações de serviço. As codificações binárias são geralmente mais compactas do que as codificações de texto. Quando o tamanho da mensagem estiver em alta, considere também compactar o conteúdo da mensagem durante a codificação. No entanto, a compactação adiciona custos de processamento para o emissor e o recetor da mensagem. Binário
Transmissão O streaming permite que os aplicativos comecem a processar uma mensagem antes que a mensagem inteira chegue. O uso efetivo de streaming requer que os dados importantes para uma mensagem estejam disponíveis no início da mensagem, para que o aplicativo recetor não precise esperar que ela chegue. Além disso, os aplicativos que usam transferência transmitida devem organizar os dados na mensagem de forma incremental para que o conteúdo não tenha dependências de encaminhamento. Em muitos casos, você deve comprometer entre transmitir conteúdo e ter o menor tamanho de transferência possível para esse conteúdo. Nenhuma
Suporte a ferramentas de terceiros As áreas de suporte para uma codificação incluem desenvolvimento e diagnóstico. Desenvolvedores de terceiros fizeram um grande investimento em bibliotecas e kits de ferramentas para lidar com mensagens codificadas no formato POX. Texto (POX)
Interoperabilidade Esse fator refere-se à capacidade de um codificador WCF de interoperar com serviços não-WCF. Texto

MTOM (parcial)

Nota: Ao usar o codificador binário, usar a configuração IgnoreWhitespace ao criar um XMLReader não terá efeito. Por exemplo, se você fizer o seguinte dentro de uma operação de serviço:

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);
}

A configuração IgnoreWhitespace é ignorada.

Compressão e o codificador binário

A partir do WCF 4.5, o codificador binário WCF adiciona suporte para compactação. Isso permite que você use o algoritmo gzip/deflate para enviar mensagens compactadas de um cliente WCF e também responda com mensagens compactadas de um serviço WCF auto-hospedado. Esse recurso permite a compactação nos transportes HTTP e TCP. Um serviço WCF hospedado no IIS sempre pode ser habilitado para enviar respostas compactadas configurando o servidor host do IIS. O tipo de compactação é configurado com a BinaryMessageEncodingBindingElement.CompressionFormat propriedade. Esta propriedade é definida como um dos System.ServiceModel.Channels.CompressionFormat valores enum:

Como essa propriedade só é exposta no binaryMessageEncodingBindingElement, você precisará criar uma associação personalizada como a seguinte para usar esse recurso:

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

O cliente e o serviço precisam concordar em enviar e receber mensagens compactadas e, portanto, a propriedade compressionFormat deve ser configurada no elemento binaryMessageEncoding no cliente e no serviço. Um ProtocolException é lançado se o serviço ou cliente não estiver configurado para compactação, mas o outro lado está. A ativação da compressão deve ser cuidadosamente considerada. A compactação é útil principalmente se a largura de banda da rede for um gargalo. No caso em que a CPU é o gargalo, a compactação diminuirá a taxa de transferência. Testes apropriados devem ser feitos em um ambiente simulado para descobrir se isso beneficia o aplicativo

Consulte também