Atualizações de fluxo personalizadas
Transportes orientados a fluxo, como TCP e pipes nomeados, operam em um fluxo contínuo de bytes entre o cliente e o servidor. Este fluxo é realizado por um Stream objeto. Em uma atualização de fluxo, o cliente deseja adicionar uma camada de protocolo opcional à pilha de canais e solicita que a outra extremidade do canal de comunicação 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
Há quatro componentes para o processo de atualização de fluxo.
Um iniciador de fluxo de atualização inicia o processo: em tempo de execução, ele pode iniciar uma solicitação para a outra extremidade de sua conexão para atualizar a camada de transporte de canal.
Um fluxo de atualização O Acceptor realiza a atualização: em tempo de execução, ele recebe a solicitação 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 Vinculação de atualização de fluxo é adicionado às associações no serviço e no cliente e cria 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 os implementos 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.
Substitua o BuildClientStreamUpgradeProvider método no cliente e o BuildServerStreamUpgradeProvider método no serviço.
Substitua o BuildChannelFactory método no cliente e o BuildChannelListener método no serviço para adicionar o elemento de vinculação de atualização ao 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 elementos de ligação para atualizar a segurança do fluxo. 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 vinculação têm métodos que criam as classes de provedor de atualização de fluxo de segurança especializado, que não public
são , portanto, para esses dois casos, tudo o que você precisa fazer é adicionar o elemento binding à 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. Substitua as propriedades adicionais nessas classes para fornecer informações de segurança ao tempo de execução.
Várias atualizações
Para criar solicitações de atualização adicionais, repita o processo acima: crie extensões adicionais e elementos de StreamUpgradeProvider ligação. Adicione os elementos de ligação à ligação. 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 certificando-se de substituir o GetNextUpgrade método para retornar os tipos de conteúdo para o fluxo de compactação e o fluxo seguro em ordem.
Subclassifique o StreamSecurityUpgradeAcceptor que compreende os tipos de conteúdo personalizados em seu CanUpgrade método.
O fluxo será atualizado após cada chamada para GetNextUpgrade e CanUpgrade.