Transmissão de transferência de mensagem

Os transportes do Windows Communication Foundation (WCF) dão suporte a dois modos para transferir mensagens:

  • As transferências em buffer mantêm a mensagem inteira em um buffer de memória até que a transferência seja concluída. Uma mensagem em buffer deve ser entregue completamente antes que um receptor possa lê-la.

  • As transferências transmitidas expõem a mensagem como uma transmissão. O receptor começa a processar a mensagem antes de ser entregue completamente.

  • As transferências transmitidas podem melhorar a escalabilidade de um serviço eliminando o requisito de buffers de memória grandes. Se a alteração do modo de transferência melhora a escalabilidade depende do tamanho das mensagens que estão sendo transferidas. Tamanhos de mensagens grandes favorecem o uso de transferências transmitidas.

Por padrão, os transportes HTTP, TCP/IP e pipe nomeados usam transferências em buffer. Este documento descreve como alternar esses transportes de um modo de transferência em buffer para transmitido e as consequências de fazê-lo.

Habilitando transferências transmitidas

A seleção entre os modos de transferência em buffer e transmitida é feita no elemento de associação do transporte. O elemento de associação tem uma propriedade TransferMode que pode ser definida comoBuffered, Streamed, StreamedRequest ou StreamedResponse. Definir o modo de transferência para Streamed habilita a comunicação de streaming em ambas as direções. Definir o modo de transferência para StreamedRequest ou StreamedResponse habilita a comunicação de streaming somente na direção indicada.

As associações BasicHttpBinding, NetTcpBinding e NetNamedPipeBinding expõem a propriedade TransferMode. Para outros transportes, você deve criar uma associação personalizada para definir o modo de transferência.

A decisão de usar transferência em buffer ou em streaming é uma decisão local do ponto de extremidade. Para transportes HTTP, o modo de transferência não se propaga em uma conexão ou para servidores e outros intermediários. A definição do modo de transferência não é refletida na descrição da interface de serviço. Após gerar uma classe de cliente para um serviço, você deve editar o arquivo de configuração dos serviços destinados a serem usados com transferências em transmissão para definir o modo. Para transportes TCP e pipe nomeado, o modo de transferência é propagado como uma declaração de política.

Para obter exemplos de código, consulte Como habilitar o streaming.

Habilitando o streaming assíncrono

Para habilitar o streaming assíncrono, adicione o comportamento do ponto de extremidade DispatcherSynchronizationBehavior ao host de serviço e defina sua propriedade AsynchronousSendEnabled como true.

Esta versão do WCF também adiciona o recurso de streaming assíncrono verdadeiro no lado do envio. Isso melhora a escalabilidade do serviço em cenários onde ele está executando o streaming de mensagens para vários clientes, alguns dos quais estão lendo lentamente, possivelmente devido a congestionamento da rede, ou não estão lendo nada. Nesses cenários, o WCF não bloqueia mais threads individuais no serviço por cliente. Isso garante que o serviço possa processar muito mais clientes, melhorando dessa forma a escalabilidade do serviço.

Restrições em transferências transmitidas

O uso do modo de transferência transmitido faz com que o tempo de execução imponha restrições adicionais.

As operações que ocorrem em um transporte transmitido podem ter um contrato com no máximo um parâmetro de entrada ou saída. Esse parâmetro corresponde a todo o corpo da mensagem e deve ser um Message, um tipo derivado Stream ou uma implementação IXmlSerializable. Ter um valor retornado para uma operação equivale a ter um parâmetro de saída.

Alguns recursos do WCF, como mensagens confiáveis, transações e segurança no nível de mensagem SOAP, dependem de mensagens de buffer para transmissões. O uso desses recursos pode reduzir ou eliminar os benefícios de desempenho obtidos usando streaming. Para proteger um transporte transmitido, use apenas a segurança no nível do transporte ou use a segurança no nível do transporte, além da segurança de mensagem somente autenticação.

Os cabeçalhos SOAP são sempre armazenados em buffer, mesmo quando o modo de transferência é definido como transmitido. Os cabeçalhos de uma mensagem não devem exceder o tamanho da cota de transporte MaxBufferSize. Para obter mais informações sobre esta configuração, consulte Cotas de Transporte.

Diferenças entre transferências em buffer e transmitidas

Alterar o modo de transferência de buffer para transmitido também altera a forma de canal nativo do TCP e os transportes de pipe nomeados. Para transferências em buffer, a forma do canal nativo é IDuplexSessionChannel. Para transferências transmitidas, os canais nativos são IRequestChannel e IReplyChannel. Alterar o modo de transferência em um aplicativo existente que usa esses transportes diretamente (ou seja, não por meio de um contrato de serviço) requer a alteração da forma de canal esperada para fábricas de canais e ouvintes.

Confira também