Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Transportes orientados a fluxo, como TCP e Named Pipes, operam numa transmissão contínua de bytes entre o cliente e o servidor. Este fluxo é realizado por um Stream objeto. Numa atualização de fluxo de dados, o cliente deseja adicionar uma camada de protocolo opcional à pilha de canais e solicita à outra extremidade do canal de comunicação que faça isso. A atualização de fluxo consiste em substituir o objeto original Stream por um atualizado.
Por exemplo, você pode criar um fluxo de compactação diretamente sobre o fluxo de transporte. Neste caso, o transporte Stream original é substituído por um que envolve a compressão Stream em torno do original.
Você pode aplicar várias atualizações de fluxo, cada uma envolvendo a anterior.
Como funcionam as atualizações de fluxo
Existem quatro componentes no processo de atualização do fluxo de dados.
Um Iniciador de fluxo de atualização inicia o processo: em tempo de execução pode iniciar um pedido para a outra extremidade da sua ligação para atualizar a camada de transporte do canal.
Um Aceitador de fluxo de atualização realiza a atualização: em tempo de execução recebe o pedido de atualização da outra máquina e, se possível, aceita a atualização.
Um provedor de atualização cria o iniciador no cliente e o aceitador no servidor.
Um Elemento de Ligação de atualização do fluxo é adicionado às ligações no serviço e no cliente, criando o provedor em tempo de execução.
Observe que, no caso de várias atualizações, o Iniciador e o Aceitador encapsulam máquinas de estado para impor quais transições de atualização são válidas para cada Iniciação.
Como implementar uma atualização de fluxo
Windows Communication Foundation (WCF) fornece quatro abstract classes que você pode implementar:
Para implementar uma atualização de fluxo personalizada, faça o seguinte. Este procedimento implementa um processo mínimo de atualização de fluxo nas máquinas cliente e servidor.
Crie uma classe que implemente o StreamUpgradeInitiator.
Substitua o InitiateUpgrade método para receber o fluxo a ser atualizado e retorne o fluxo atualizado. Este método funciona de forma síncrona; Existem métodos análogos para iniciar a atualização de forma assíncrona.
Substitua o GetNextUpgrade método para verificar se há atualizações adicionais.
Crie uma classe que implemente o StreamUpgradeAcceptor.
Substitua o AcceptUpgrade método para receber o fluxo a ser atualizado e retorne o fluxo atualizado. Este método funciona de forma síncrona; Existem métodos análogos para aceitar a atualização de forma assíncrona.
Substitua o CanUpgrade método para determinar se a atualização solicitada é suportada por esse aceitador de atualização neste ponto do processo de atualização.
Crie uma classe que implementa StreamUpgradeProvider. Substitua os CreateUpgradeAcceptor e os CreateUpgradeInitiator métodos para retornar instâncias do aceitador e iniciador definidos nas etapas 2 e 1.
Crie uma classe que implemente o StreamUpgradeBindingElement.
Sobrescreva o método BuildClientStreamUpgradeProvider no cliente e o método BuildServerStreamUpgradeProvider no serviço.
Sobrescreva o método BuildChannelFactory no cliente e o método BuildChannelListener no serviço para adicionar o Elemento de Ligação de Atualização a BindingParameters.
Adicione o novo elemento de vinculação de atualização de fluxo às associações nas máquinas cliente e servidor.
Atualizações de segurança
Adicionar uma atualização de segurança é uma versão especializada do processo de atualização de fluxo geral.
O WCF já fornece dois componentes de ligação para atualizar a segurança do streaming. A configuração de segurança no nível de transporte é encapsulada pelo WindowsStreamSecurityBindingElement e o SslStreamSecurityBindingElement que pode ser configurado e adicionado a uma associação personalizada. Esses elementos de ligação estendem a StreamUpgradeBindingElement classe que cria os provedores de atualização de fluxo de cliente e servidor. Esses elementos de ligação têm métodos que criam as classes do fornecedor de atualização do fluxo especializado de segurança, que não public, portanto, para esses dois casos, tudo o que é necessário é adicionar o elemento de ligação à associação.
Para cenários de segurança não atendidos pelos dois elementos de ligação acima, três classes relacionadas à abstract segurança são derivadas das classes base do iniciador, do aceitador e do provedor acima:
O processo de implementação de uma atualização de fluxo de segurança é o mesmo que antes, com a diferença de que você derivaria dessas três classes. Sobreponha as propriedades adicionais nessas classes para fornecer informações de segurança ao ambiente de execução.
Várias atualizações
Para criar solicitações de atualização adicionais, repita o processo acima: crie extensões adicionais de StreamUpgradeProvider e elementos de ligação. Adicione os elementos de ligação ao conjunto de ligações. Os elementos de ligação adicionais são processados sequencialmente, começando com o primeiro elemento de ligação adicionado à ligação. Em BuildChannelFactory e BuildChannelListener cada provedor de atualização pode determinar como se sobrepor a qualquer parâmetro de vinculação de atualização pré-existente. Em seguida, ele deve substituir o parâmetro de vinculação de atualização existente por um novo parâmetro de vinculação de atualização composto.
Como alternativa, um provedor de atualização pode oferecer suporte a várias atualizações. Por exemplo, talvez você queira implementar um provedor de atualização de fluxo personalizado que ofereça suporte à segurança e à compactação. Efetue os seguintes passos:
Subclasse StreamSecurityUpgradeProvider para escrever a classe de provedor que cria o Iniciador e o Aceitador.
Subclassifique o StreamSecurityUpgradeInitiator assegurando-se de substituir o método GetNextUpgrade para retornar os tipos de conteúdo para o fluxo de compactação e para o fluxo seguro, na ordem especificada.
Crie uma subclasse de StreamSecurityUpgradeAcceptor que compreende os tipos de conteúdo personalizados no seu método CanUpgrade.
O fluxo será atualizado após cada chamada para GetNextUpgrade e CanUpgrade.