Escolher um codificador de mensagens
Este artigo aborda os critérios necessários para a escolha de um entre vários codificadores de mensagens incluídos no WCF (Windows Communication Foundation): binário, texto e MTOM (Mecanismo de Otimização de Transmissão de Mensagens).
No WCF, você especifica como os dados serão transferidos em uma rede entre os 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 obrigatório e um elemento de associação de transporte obrigató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 obrigatório. No lado da saída, um codificador de mensagens serializa a Message de saída e a transmite para o transporte. No lado da entrada, um codificador de mensagens recebe a forma serializada de uma Message do transporte e a transmite para a camada de protocolo superior, se presente ou para o aplicativo, caso contrário.
Ao se conectar a um cliente ou a um servidor preexistente, talvez você não tenha a opção de usar uma codificação de mensagem específica, pois precisa codificar suas mensagens de uma forma que o outro lado esteja 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 comunicação com o serviço em vez do ponto de extremidade que é melhor para eles, além de dar aos clientes a flexibilidade para escolher da codificação mais adequada. O uso de vários pontos de extremidade também permite combinar as vantagens de diferentes codificações de mensagens com outros elementos de associação.
Codificadores fornecidos pelo sistema
O WCF inclui três codificadores de mensagens, que são representados pelas três seguintes classes:
TextMessageEncodingBindingElement, o codificador de mensagens de texto, dá suporte à codificação XML simples e à codificação SOAP. O modo de codificação XML simples do codificador de mensagens de texto é chamado de POX ("XML básico") para distingui-lo da codificação SOAP baseada em texto. Para habilitar o POX, defina a propriedade MessageVersion como None. Use o codificador de mensagens de texto para interoperar com os pontos de extremidade não WCF.
BinaryMessageEncodingBindingElement, o codificador de mensagens binárias, usa um formato binário compacto e é otimizado para a comunicação do WCF para o WCF e, portanto, não é interoperável. Esse também é o codificador com melhor desempenho de todos os codificadores fornecidos pelo WCF.
MtomMessageEncodingBindingElement, o elemento de associação, especifica a codificação de caracteres e o controle de versão da mensagem para as mensagens usando a codificação MTOM. O MTOM é uma tecnologia eficiente para transmitir dados binários em mensagens do 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 como estão, sem conversão em texto. Em termos de eficiência, entre os codificadores fornecidos pelo WCF, o MTOM está entre texto (o mais lento) e 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 mensagens que funcionam melhor com esses fatores. Lembre-se de considerar os fatores adicionais não listados nesta tabela e os codificadores de mensagens personalizados que possam ser necessários no seu aplicativo.
Fator | Descrição | Codificadores que dão suporte a esse fator |
---|---|---|
Conjuntos de caracteres com suporte | O TextMessageEncodingBindingElement e o MtomMessageEncodingBindingElement só dão suporte à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 precisará ser usado. Para ver um exemplo de codificador personalizado, confira Codificador de mensagens personalizado. | 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 a capacidade de inspecionar mensagens. A confidencialidade protege uma mensagem de ser examinada, e a integridade protege uma mensagem de ser modificada. | Texto |
Confiabilidade | Confiabilidade é a resiliência de um codificador para erros de transmissão. A confiabilidade também pode ser fornecida na camada de mensagem, de transporte ou de aplicativo. Todos os codificadores padrão do WCF 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 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 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 destinatário da mensagem. | Binário |
Streaming | O streaming permite que os aplicativos comecem a processar uma mensagem antes que toda a mensagem seja recebida. O uso efetivo do streaming exige que os dados importantes de uma mensagem estejam disponíveis no início da mensagem para que o aplicativo de recebimento não seja obrigado a aguardar a chegada dela. Além disso, os aplicativos que usam a transferência transmitida precisam organizar os dados na mensagem incrementalmente para que o conteúdo não tenha dependências de encaminhamento. Em muitos casos, você precisa encontrar um meio-termo entre transmitir o conteúdo e o ter o menor tamanho de transferência possível para esse conteúdo. | Nenhum |
Suporte a ferramentas de terceiros | As áreas de suporte para uma codificação incluem o desenvolvimento e o diagnóstico. Os desenvolvedores de terceiros fizeram um grande investimento em bibliotecas e kits de ferramentas para processar mensagens codificadas no formato POX. | Texto (POX) |
Interoperabilidade | Esse fator se refere à capacidade de um codificador WCF de interoperar com serviços não WCF. | Texto MTOM (parcial) |
Observação: quando o Codificador Binário for usado, o uso da configuração IgnoreWhitespace na criação de um XMLReader não terá efeito. Por exemplo, se você fizer o seguinte em 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 será ignorada.
Compactação e o codificador binário
A partir do WCF 4.5, o codificador binário do WCF adiciona suporte para compactação. Isso permite que você use o algoritmo gzip/deflate para enviar mensagens compactadas de um cliente WCF e 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 com a configuração do servidor host do IIS. O tipo de compactação é configurado com a propriedade BinaryMessageEncodingBindingElement.CompressionFormat. 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 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 precisa 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 é mais útil se a largura de banda de rede é um gargalo. No caso em que a CPU é o gargalo, a compactação diminui a taxa de transferência. Um teste apropriado precisará ser feito em um ambiente simulado para descobrir se isso beneficiará o aplicativo