Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo MessageInterceptor demonstra o uso do modelo de extensibilidade de canal. Em especial, ele demonstra como implementar um elemento de associação personalizado que cria fábricas de canais e ouvintes de canal para interceptar todas as mensagens de entrada e saída em um determinado ponto da pilha de tempo de execução. O exemplo também inclui um cliente e um servidor que demonstram o uso dessas fábricas personalizadas.
Neste exemplo, o cliente e o serviço são programas de console (.exe). O cliente e o serviço usam uma biblioteca comum (.dll) que contém o elemento de associação personalizado e seus objetos de tempo de execução associados.
Observação
O procedimento de instalação e as instruções de build para este exemplo estão localizados no final deste tópico.
A amostra descreve o procedimento recomendado para criar um canal em camadas personalizado no WCF (Windows Communication Foundation), usando a estrutura de canal e segundo as práticas recomendadas do WCF. As etapas para criar um canal em camadas personalizado são as seguintes:
Decida a qual das formas de canal a fábrica de canais e o ouvinte de canais darão suporte.
Crie uma fábrica de canais e um ouvinte de canais que deem suporte às formas do canal.
Adicione um elemento de associação que acrescenta o canal em camadas personalizado a uma pilha de canais.
Adicione uma seção de extensão de elemento de associação para expor o novo elemento de associação ao sistema de configuração.
Formas de Canal
A primeira etapa na criação de um canal em camadas personalizado é decidir quais formas o canal necessita. Para nosso inspetor de mensagens, damos suporte a qualquer forma que a camada abaixo de nós dê suporte (por exemplo, se a camada abaixo de nós puder compilar IOutputChannel e IDuplexSessionChannel, em seguida, também exporemos IOutputChannel e IDuplexSessionChannel).
Fábrica de Canais e fábrica de ouvintes
A próxima etapa na criação de um canal em camadas personalizado é criar uma implementação de IChannelFactory para canais cliente e de IChannelListener para canais de serviço.
Essas classes pegam uma fábrica e um ouvinte internos e delegam todas, exceto as chamadas OnCreateChannel
e OnAcceptChannel
para a fábrica e o ouvinte internos.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
//...
}
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
//...
}
Adicionando um elemento de associação
O exemplo define um elemento de associação personalizado: InterceptingBindingElement
.
InterceptingBindingElement
recebe um ChannelMessageInterceptor
como entrada e utiliza este ChannelMessageInterceptor
para manipular mensagens que passam por ele. Esta é a única classe que deve ser pública. A fábrica, o ouvinte e os canais podem ser implementações internas das interfaces públicas em tempo de execução.
public class InterceptingBindingElement : BindingElement
{
}
Adicionando suporte à configuração
Para se integrar à configuração de associação, a biblioteca define um manipulador de seção de configuração como uma seção de extensão de elemento de associação. Os arquivos de configuração do cliente e do servidor devem registrar a extensão do elemento de associação com o sistema de configuração. Os implementadores que desejam expor seu elemento de associação ao sistema de configuração podem derivar dessa classe.
public abstract class InterceptingElement : BindingElementExtensionElement
{
//...
}
Adicionar política
Para se integrar ao nosso sistema de políticas, InterceptingBindingElement
implementa IPolicyExportExtension para sinalizar que devemos participar na geração de política. Para dar suporte à importação de política em um cliente gerado, o usuário pode registrar uma classe derivada de InterceptingBindingElementImporter
e substituir CreateMessageInterceptor
() para gerar sua classe habilitada ChannelMessageInterceptor
para política.
Exemplo: Inspetor de mensagens descartáveis
Na amostra está incluída uma implementação de exemplo de ChannelMessageInspector
que descarta mensagens.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
Você pode acessá-lo da configuração da seguinte maneira:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
O cliente e o servidor usam essa seção de configuração recém-criada para inserir as fábricas personalizadas no nível mais baixo de suas pilhas de canais de tempo de execução (acima do nível de transporte).
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
O cliente usa a MessageInterceptor
biblioteca para adicionar um cabeçalho personalizado a mensagens numeradas uniformes. O serviço, por outro lado, usa MessageInterceptor
a biblioteca para remover as mensagens que não têm esse cabeçalho especial.
Você deverá ver a seguinte saída do cliente após executar primeiro o serviço e, em seguida, o cliente.
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
O cliente reporta 10 velocidades de vento diferentes para o serviço, mas etiqueta apenas metade delas com o cabeçalho especial.
Você deve ver a saída a seguir no serviço:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
Para configurar, compilar e executar o exemplo
Instale ASP.NET 4.0 usando o comando a seguir.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Verifique se você executou o Procedimento de instalação avulsa dos exemplos do Windows Communication Foundation.
Para criar a solução, siga as instruções na criação dos exemplos do Windows Communication Foundation.
Para executar o exemplo em uma configuração única ou entre máquinas, siga as instruções em Executando os exemplos do Windows Communication Foundation.
Execute o Service.exe primeiro, execute Client.exe em seguida e observe as duas janelas do console para obter saída.