Partilhar via


Transferência de mensagens de streaming

Os transportes do Windows Communication Foundation (WCF) suportam 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 completamente entregue antes que um recetor possa lê-la.

  • As transferências transmitidas em fluxo expõem a mensagem como um fluxo. O recetor começa a processar a mensagem antes que ela seja completamente entregue.

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

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

Ativando transferências em streaming

A seleção entre os modos de transferência em buffer e streaming é feita no elemento de ligação do transporte. O elemento binding tem uma TransferMode propriedade que pode ser definida como Buffered, Streamed, StreamedRequest, ou StreamedResponse. Definir o modo de transferência para Streamed permite a comunicação de streaming em ambas direções. Definir o modo de transferência para StreamedRequest ou StreamedResponse ativa a comunicação em streaming apenas na direção indicada.

Os BasicHttpBinding, NetTcpBinding e NetNamedPipeBinding bindings 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ências em buffer ou transmitidas em fluxo é uma decisão local do ponto de extremidade. Para transportes HTTP, o modo de transferência não se propaga através de uma conexão ou para servidores e outros intermediários. A configuração do modo de transferência não é refletida na descrição da interface de serviço. Depois de gerar uma classe de cliente para um serviço, você deve editar o arquivo de configuração para serviços destinados a serem usados com transferências transmitidas para definir o modo. Para TCP e transportes de pipe nomeado, o modo de transferência é propagado como uma asserçã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 DispatcherSynchronizationBehavior comportamento de ponto de extremidade ao host de serviço e defina a sua AsynchronousSendEnabled propriedade como true.

Esta versão do WCF também adicionou a capacidade de streaming assíncrono verdadeiro no lado do envio. Isso melhora a escalabilidade do serviço em cenários em que está a transmitir mensagens para vários clientes, alguns dos quais são lentos na leitura, possivelmente devido ao congestionamento da rede ou não estão a ler de todo. Nesses cenários, o WCF não bloqueia mais threads individuais no serviço por cliente. Isso garante que o serviço seja capaz de processar muito mais clientes, melhorando assim a escalabilidade do serviço.

Restrições às transferências em streaming

Usar o modo de transferência transmitida 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 de Stream, ou uma IXmlSerializable implementação. Ter um valor de retorno para uma operação é equivalente 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 em buffer para transmissões. O uso desses recursos pode reduzir ou eliminar os benefícios de desempenho obtidos com o uso de streaming. Para proteger um transporte transmitido, use segurança apenas no nível do transporte ou combine com segurança da mensagem apenas de autenticação.

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

Diferenças entre transferências em buffer e transmitidas em fluxo

Alterar o modo de transferência de buffered para streamed também altera a forma do canal nativo dos transportes TCP e pipe nomeado. Para transferências em buffer, a forma de 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 alterar a forma de canal esperada para fábricas de canais e ouvintes.

Consulte também