Compartilhar via


Escolher um codificador de mensagens

Este artigo discute os critérios para escolher entre os codificadores de mensagem incluídos no WCF (Windows Communication Foundation): mecanismo binário, de texto e de otimização de transmissão de mensagens (MTOM).

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

O elemento de associação de codificação de mensagem fica abaixo dos elementos de associação de protocolo opcionais e acima do elemento de associação de transporte necessário. No lado da saída, um codificador de mensagens serializa a Message de saída e a transmite para o transporte. No lado receptor, um codificador de mensagem recebe a forma serializada de um Message do transporte e a envia para a camada de protocolo superior, se disponível, ou para o aplicativo, caso contrário.

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

Codificadores System-Provided

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

  • TextMessageEncodingBindingElement, o codificador de mensagem de texto, dá suporte à codificação XML simples e à codificação SOAP. O modo de codificação XML simples do codificador de mensagem de texto é chamado de "POX" (XML antigo simples) para distingui-lo da codificação SOAP baseada em texto. Para habilitar o POX, defina a MessageVersion propriedade como None. Utilize o codificador de mensagens de texto para interoperar com endpoints que não são WCF.

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

  • MtomMessageEncodingBindingElement, o elemento de associação, especifica a codificação de caracteres e o controle de versão de mensagens para mensagens usando a codificação MTOM. O 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 na forma textual, mas otimiza grandes blocos de dados binários transmitindo-os as-is, 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 importantes para seu aplicativo e escolha os codificadores de mensagem que funcionam melhor com esses fatores. Considere quaisquer fatores adicionais não listados nesta tabela e quaisquer codificadores de mensagem personalizados que possam ser necessários em seu aplicativo.

Fator Descrição Codificadores que dão suporte a esse fator
Conjuntos de caracteres com suporte TextMessageEncodingBindingElement e MtomMessageEncodingBindingElement dá suporte apenas às 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 codificador personalizado de exemplo, consulte o Codificador de Mensagens Personalizadas. Texto
Inspeção A 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, no nível da mensagem ou 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 para erros de transmissão. A confiabilidade também pode ser fornecida na camada de mensagem, transporte ou aplicativo. Todos os codificadores WCF padrão pressupõem que outra camada esteja fornecendo confiabilidade. O codificador tem pouca capacidade de se recuperar de um erro de transmissão. Nenhum
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 simplificar e a codificação de texto POX tem a vantagem adicional de não exigir suporte para o processamento de 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 geralmente são mais compactas do que as codificações de texto. Quando o tamanho da mensagem estiver além do aceitável, considere também a compactação do conteúdo da mensagem durante a codificação. No entanto, a compactação adiciona custos de processamento para o remetente e o receptor da mensagem. Binário
Transmissão ao vivo O streaming permite que os aplicativos comecem a processar uma mensagem antes da chegada de toda a mensagem. O uso efetivo do streaming requer que os dados importantes de uma mensagem estejam disponíveis no início da mensagem para que o aplicativo receptor não seja obrigado a aguardar a chegada dela. Além disso, os aplicativos que usam a transferência em fluxo contínuo devem organizar os dados na mensagem incrementalmente para que o conteúdo não tenha dependências futuras. Em muitos casos, você deve conciliar entre o conteúdo transmitido e o menor tamanho de transferência possível para esse conteúdo. Nenhum
Suporte a ferramentas de terceiros As áreas de suporte para 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)

Observação: 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.

Compactação e o codificador binário

A partir do WCF 4.5, o codificador binário WCF adiciona suporte à compactação. Isso permite que você use o algoritmo gzip/deflate para enviar mensagens compactadas de um cliente WCF e também responder com mensagens compactadas de um serviço WCF auto-hospedado. Esse recurso habilita a compactação nos transportes HTTP e TCP. Um serviço WCF hospedado pelo 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 valores de enumeração System.ServiceModel.Channels.CompressionFormat:

Como essa propriedade só é exposta no binaryMessageEncodingBindingElement, você precisará criar uma associação personalizada como a seguinte para usar este 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. Uma ProtocolException será gerada se o serviço ou o cliente não estiver configurado para compactação, mas se o outro lado estiver. A habilitação da compactação deve ser cuidadosamente considerada. A compactação será útil principalmente se a largura de banda de rede for um gargalo. No caso em que a CPU for o gargalo, a compactação diminuirá a taxa de transferência. O teste apropriado deve ser feito em um ambiente simulado para descobrir se isso beneficia o aplicativo

Consulte também