Partilhar via


Escolher um filtro

Ao configurar o Serviço de Roteamento, é importante selecionar filtros de mensagem corretos e configurá-los para permitir que você faça correspondências exatas com as mensagens recebidas. Se os filtros selecionados forem excessivamente amplos em suas correspondências ou configurados incorretamente, as mensagens serão roteadas incorretamente. Se os filtros forem muito restritivos, poderá não ter quaisquer rotas válidas disponíveis para algumas das suas mensagens.

Tipos de filtro

Ao selecionar os filtros usados pelo Serviço de Roteamento, é importante que você entenda como cada filtro funciona, bem como quais informações estão disponíveis como parte das mensagens de entrada. Por exemplo, se todas as mensagens forem recebidas no mesmo ponto de extremidade, os filtros Address e EndpointName não serão úteis porque todas as mensagens correspondem a esses filtros.

Ação

O filtro Ação inspeciona a Action propriedade. Se o conteúdo do cabeçalho Action na mensagem corresponder ao valor de dados do filtro especificado na configuração do filtro, esse filtro retornará true. O exemplo a seguir define um FilterElement que usa o filtro Action para corresponder mensagens com um cabeçalho de ação que contém um valor de http://namespace/contract/operation/.

<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/" />
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });

Esse filtro deve ser usado ao rotear mensagens que contenham um cabeçalho de ação exclusivo.

Endereço do ponto de extremidade

O filtro EndpointAddress inspeciona o EndpointAddress no qual a mensagem foi recebida. Se o endereço ao qual a mensagem chega corresponder exatamente ao endereço do filtro especificado na configuração do filtro, esse filtro retornará true. O exemplo a seguir define um FilterElement que usa o filtro Address para corresponder a quaisquer mensagens endereçadas a "http://< hostname>/vdir/s.svc/b".

<filter name="address1" filterType="EndpointAddress" filterData="http://host/vdir/s.svc/b" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);

Nota

É importante notar que a parte do nome do host de um endereço pode diferir com base no fato de o cliente usar o nome de domínio totalmente qualificado, nome NetBIOS, endereço IP ou outro nome. Como valores diferentes podem se referir ao mesmo host, o comportamento padrão para essa comparação é não usar a parte do nome do host do endereço ao executar correspondências.

Esse comportamento pode ser modificado para permitir que a comparação avalie o nome do host ao configurar o serviço de roteamento programaticamente.

Esse filtro deve ser usado quando as mensagens recebidas são endereçadas a um endereço exclusivo.

EndpointAddressPrefix

O filtro EndpointAddressPrefix é semelhante ao filtro EndpointAddress. O filtro EndpointAddressPrefix inspeciona o EndpointAddress no qual a mensagem foi recebida. No entanto, o filtro EndpointAddressPrefix atua como um curinga, combinando endereços que começam com o valor especificado na configuração do filtro. O exemplo a seguir define um FilterElement que usa o filtro EndpointAddressPrefix para corresponder a quaisquer mensagens endereçadas a http://<hostname>/vdir*.

<filter name="prefix1" filterType="EndpointAddressPrefix" filterData="http://host/vdir" />
PrefixEndpointAddressMessageFilter prefix1 = new PrefixEndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);

Nota

É importante notar que a parte do nome do host de um endereço pode diferir com base no fato de o cliente usar o nome de domínio totalmente qualificado, nome NetBIOS, endereço IP ou outro nome. Como valores diferentes podem se referir ao mesmo host, o comportamento padrão para essa comparação é não usar a parte do nome do host do endereço ao executar correspondências.

Esse filtro deve ser usado ao rotear mensagens de entrada que compartilham um prefixo de endereço comum.

AND

O filtro AND não filtra diretamente um valor dentro de uma mensagem, mas permite que você combine dois outros filtros para criar uma AND condição em que ambos os filtros devem corresponder à mensagem antes que o filtro AND seja avaliado como true. Isso permite que você crie filtros complexos que só correspondem se todos os subfiltros corresponderem. O exemplo a seguir define um filtro de endereço e um filtro de ação e, em seguida, define um filtro AND que avalia uma mensagem em relação aos filtros de endereço e ação. Se os filtros de endereço e ação corresponderem, o filtro AND retornará true.

<filter name="address1" filterType="AddressPrefix" filterData="http://host/vdir"/>
<filter name="action1" filterType="Action" filterData="http://namespace/contract/operation/"/>
<filter name="and1" filterType="And" filter1="address1" filter2="action1" />
EndpointAddressMessageFilter address1 = new EndpointAddressMessageFilter(new EndpointAddress("http://host/vdir/s.svc/b"), false);
ActionMessageFilter action1 = new ActionMessageFilter(new string[] { "http://namespace/contract/operation" });
StrictAndMessageFilter and1=new StrictAndMessageFilter(address1, action1);

Esse filtro deve ser usado quando você deve combinar a lógica de vários filtros para determinar quando uma correspondência deve ser feita. Por exemplo, se você tiver vários destinos que devem receber apenas determinadas combinações de ações e mensagens para endereços específicos, poderá usar um filtro AND para combinar os filtros Ação e Endereço necessários.

Personalizado

Ao selecionar o tipo de filtro Personalizado, você deve fornecer um valor customType que contenha o tipo do assembly que contém a implementação MessageFilter a ser usada para esse filtro. Além disso, filterData deve conter quaisquer valores que o filtro personalizado possa exigir em sua avaliação de mensagens. O exemplo a seguir define um FilterElement que usa a CustomAssembly.MyCustomMsgFilter implementação MessageFilter.

<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");

Se você precisar executar a lógica de correspondência personalizada em relação a uma mensagem que não é coberta pelos filtros fornecidos com o .NET Framework 4.6.1, você deve criar um filtro personalizado que é uma implementação da classe MessageFilter . Por exemplo, você pode criar um filtro personalizado que compara um campo na mensagem de entrada com uma lista de valores conhecidos fornecidos ao filtro como configuração ou que faz hash de um elemento de mensagem específico e, em seguida, examina esse valor para determinar se o filtro deve retornar true ou false.

Nome do ponto de extremidade

O filtro EndpointName inspeciona o nome do ponto de extremidade que recebeu a mensagem. O exemplo a seguir define um FilterElement que usa o filtro EndpointName para rotear mensagens recebidas no "SvcEndpoint".

<filter name="name1" filterType="Endpoint" filterData="SvcEndpoint" />
EndpointNameMessageFilter name1 = new EndpointNameMessageFilter("SvcEndpoint");

Esse filtro é útil quando o Serviço de Roteamento expõe mais de um ponto de extremidade de serviço nomeado. Por exemplo, você pode expor dois pontos de extremidade que o Serviço de Roteamento usa para receber mensagens; Um é usado por clientes prioritários que exigem processamento em tempo real de suas mensagens, enquanto o outro ponto de extremidade recebe mensagens que não são sensíveis ao tempo.

Embora muitas vezes você possa usar a correspondência de endereço completo para determinar em qual ponto de extremidade uma mensagem foi recebida, usar o nome do ponto de extremidade definido é um atalho conveniente que geralmente é menos propenso a erros, especialmente ao configurar um Serviço de Roteamento usando um arquivo de configuração (onde os nomes de ponto de extremidade são um atributo necessário).

MatchAll

O filtro MatchAll corresponde a qualquer mensagem recebida. É útil se você sempre deve rotear todas as mensagens recebidas para um ponto de extremidade específico, como um serviço de registro em log que armazena uma cópia de todas as mensagens recebidas. O exemplo a seguir define um FilterElement que usa o filtro MatchAll.

<filter name="matchAll1" filterType="MatchAll" />
MatchAllMessageFilter matchAll1 = new MatchAllMessageFilter();

XPath

O filtro XPath permite especificar uma consulta XPath que é usada para inspecionar um elemento específico na mensagem. A filtragem XPath é uma poderosa opção de filtragem que permite inspecionar diretamente qualquer entrada endereçável XML dentro da mensagem; no entanto, requer que você tenha conhecimento específico da estrutura das mensagens que você está recebendo. O exemplo a seguir define um FilterElement que usa o filtro XPath para inspecionar a mensagem em busca de um elemento chamado "element" dentro do namespace referenciado pelo prefixo do namespace "ns".

<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");

Este filtro é útil se souber que as mensagens que está a receber contêm um valor específico. Por exemplo, se você estiver hospedando duas versões do mesmo serviço e souber que as mensagens endereçadas à versão mais recente do serviço contêm um valor exclusivo em um cabeçalho personalizado, poderá criar um filtro que use XPath para navegar até esse cabeçalho e comparar o valor presente no cabeçalho com outro fornecido na configuração do filtro para determinar se o filtro corresponde.

Como as consultas XPath geralmente contêm namespaces exclusivos, que geralmente são valores de cadeia de caracteres longos ou complexos, o filtro XPath permite que você use a tabela de namespace para definir prefixos exclusivos para seus namespaces. Para obter mais informações sobre a tabela de namespace, consulte Filtros de mensagens.

Para obter mais informações sobre como criar consultas XPath, consulte Sintaxe XPath.

Consulte também