Compartilhar via


Interceptor de mensagem personalizado

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 personalizada e os objetos de tempo de execução associados.

Observação

O procedimento de instalação e as instruções de compilação dessa amostra estão no final deste tópico.

O exemplo descreve o procedimento recomendado para criar um canal personalizado em camadas no WCF (Windows Communication Foundation) usando a estrutura do canal e seguindo as melhores práticas do WCF. As etapas para criar um canal em camadas definido pelo usuário são as seguintes:

  1. Decida a qual das formas de canal a fábrica de canais e o ouvinte de canais darão suporte.

  2. Crie uma fábrica de canais e um ouvinte de canais que deem suporte às formas do canal.

  3. Adicione um elemento de associação que acrescenta o canal em camadas personalizado a uma pilha de canais.

  4. 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 do canal

A primeira etapa na gravação de um canal em camadas personalizado é decidir quais formas são necessárias para o canal. 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 gravação de um canal em camadas personalizado é criar uma implementação para canais cliente IChannelFactory e canais de serviço IChannelListener.

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>
{
    //...
}

Adicionar um elemento de associação

O exemplo define um elemento de associação personalizado: InterceptingBindingElement. InterceptingBindingElement usa um ChannelMessageInterceptor como entrada, e usa esse ChannelMessageInterceptor para manipular mensagens que passam por ela. 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
{
}

Adição de 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 de 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 da geração de política. Para dar suporte à política de importação em um cliente gerado, o usuário pode registrar uma classe derivada de InterceptingBindingElementImporter e substituir CreateMessageInterceptor() para gerar sua classe ChannelMessageInterceptor habilitada para política.

Exemplo: Inspetor de mensagens descartáveis

Incluída no exemplo está uma implementação de exemplo de ChannelMessageInspector que descarta mensagens.

class DroppingServerElement : InterceptingElement
{
    protected override ChannelMessageInterceptor CreateMessageInterceptor()
    {
        return new DroppingServerInterceptor();
    }
}

Você pode acessá-la a partir da configuração, da seguinte forma:

<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 biblioteca MessageInterceptor para adicionar um cabeçalho personalizado a mensagens pares numeradas. O serviço, por outro lado, usa a biblioteca MessageInterceptor para descartar qualquer mensagem que não tenha esse cabeçalho especial.

Você deverá ver a saída do cliente a seguir depois de executar 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 relata 10 velocidades de vento diferentes ao serviço, mas marca 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

  1. Instale o ASP.NET 4.0 usando o seguinte comando.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Verifique se você executou o Procedimento de instalação única para os exemplos do Windows Communication Foundation.

  3. Para compilar a solução, siga as instruções contidas em Como compilar as amostras do Windows Communication Foundation.

  4. Para executar a amostra em uma configuração de computador único ou cruzado, siga as instruções em Como executar os exemplos do Windows Communication Foundation.

  5. Execute o Service.exe primeiro, execute Client.exe em seguida e observe as duas janelas do console para obter saída.