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 de mensagens grandes favorecem o uso de transferências transmitidas.
Por padrão, os transportes HTTP, TCP/IP e pipe nomeado 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.
Habilitando transferências transmitidas em fluxo
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
permitir a comunicação de streaming em ambas as direções. Definir o modo de transferência para StreamedRequest
ou StreamedResponse
ativar a comunicação de streaming apenas na direção indicada.
O BasicHttpBinding, NetTcpBinding, e NetNamedPipeBinding as ligações expõem a TransferMode propriedade. 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 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 DispatcherSynchronizationBehavior ponto de extremidade ao host de serviço e defina 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 ele está transmitindo mensagens para vários clientes, alguns dos quais são lentos na leitura; possivelmente devido ao congestionamento da rede ou não estão lendo em tudo. 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 transmitidas em fluxo
O uso do 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 apenas a segurança no nível do transporte ou use a segurança no nível do transporte mais a segurança da mensagem somente 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.