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 MessageFilter demonstra como substituir os filtros de mensagem que o Windows Communication Foundation (WCF) usa para despachar mensagens para endereços de destino.
Observação
O procedimento de instalação e as instruções de build para este exemplo estão localizados no final deste tópico.
Quando a primeira mensagem em um canal chega ao servidor, o servidor deve determinar quais (se houver) dos pontos de extremidade associados a esse URI devem receber a mensagem. Esse processo é controlado pelos MessageFilter objetos anexados ao EndpointDispatcher.
Cada ponto de extremidade de um serviço tem um único EndpointDispatcher. O EndpointDispatcher tem um AddressFilter e um ContractFilter. A união desses dois filtros é o filtro de mensagem usado para esse ponto de extremidade.
Por padrão, o AddressFilter para um ponto de extremidade corresponde a qualquer mensagem que seja endereçada a um endereço que combine com o EndpointAddress do ponto de extremidade do serviço. Por padrão, o ContractFilter para um ponto de extremidade inspeciona a ação da mensagem de entrada e faz correspondência com qualquer mensagem com uma ação que corresponda a uma das ações das operações do contrato de ponto de extremidade de serviço (somente ações IsInitiating=true são consideradas). Como resultado, por padrão, o filtro para um ponto de extremidade só corresponde se o cabeçalho To da mensagem for o EndpointAddress do ponto de extremidade e a ação da mensagem corresponder a uma das ações da operação de ponto de extremidade.
Esses filtros podem ser alterados usando um comportamento. No exemplo, o serviço cria um IEndpointBehavior que substitui o AddressFilter e ContractFilter no EndpointDispatcher:
class FilteringEndpointBehavior : IEndpointBehavior
{
//...
}
Dois filtros de endereço são definidos:
// Matches any message whose To address contains the letter 'e'
class MatchEAddressFilter : MessageFilter { }
// Matches any message whose To address does not contain the letter 'e'
class MatchNoEAddressFilter : MessageFilter { }
O FilteringEndpointBehavior valor é configurável e permite duas variações diferentes.
public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { }
A variação 1 corresponde apenas aos endereços que contêm um 'e' (mas que têm qualquer Ação), enquanto a Variação 2 corresponde apenas a endereços que não têm um 'e':
if (Variation == 1)
return new FilteringEndpointBehavior(
new MatchEAddressFilter(), new MatchAllMessageFilter());
else
return new FilteringEndpointBehavior(
new MatchNoEAddressFilter(), new MatchAllMessageFilter());
No arquivo de configuração, o serviço registra o novo comportamento:
<extensions>
<behaviorExtensions>
<add name="filteringEndpointBehavior" type="Microsoft.ServiceModel.Samples.FilteringEndpointBehaviorExtension, service" />
</behaviorExtensions>
</extensions>
Em seguida, o serviço cria endpointBehavior configurações para cada variação:
<endpointBehaviors>
<behavior name="endpoint1">
<filteringEndpointBehavior variation="1" />
</behavior>
<behavior name="endpoint2">
<filteringEndpointBehavior variation="2" />
</behavior>
</endpointBehaviors>
Por fim, o ponto de extremidade do serviço faz referência a um dos behaviorConfigurations:
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint2" />
A implementação do aplicativo cliente é simples; ele cria dois canais para o URI do serviço (passando esse valor como o segundo parâmetro (via) para CreateChannel(EndpointAddress) e envia uma única mensagem em cada canal, mas usa endereços de ponto de extremidade diferentes para cada um. Como resultado, as mensagens de saída do cliente têm designações To diferentes, e o servidor responde adequadamente, conforme demonstrado pela saída do cliente:
Sending message to urn:e...
Exception: The message with To 'urn:e' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.
Sending message to urn:a...
Hello
Alterar a variação no arquivo de configuração do servidor troca o filtro, e o cliente observa o comportamento oposto (a mensagem para urn:e tem sucesso, enquanto a mensagem para urn:a falha).
<endpoint address=""
bindingConfiguration="ws"
listenUri=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.IHello"
behaviorConfiguration="endpoint1" />
Para configurar, compilar e executar o exemplo
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 de computador único, siga as instruções em Executar os exemplos do Windows Communication Foundation.
Para executar o exemplo em uma configuração entre máquinas, siga as instruções em Executar os exemplos do Windows Communication Foundation e altere a linha a seguir em Client.cs.
Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc");Substitua localhost pelo nome do servidor.
Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc");