Escolhendo 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 estiverem configurados incorretamente, as mensagens serão roteadas incorretamente. Se os filtros forem muito restritivos, talvez você não tenha rotas válidas disponíveis para algumas de 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 Endereço e EndpointName não serão úteis porque todas as mensagens correspondem a esses filtros.
Ação
O filtro Ação inspeciona a propriedade Action. Se o conteúdo do cabeçalho Ação 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 Ação para corresponder a 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 Ação exclusivo.
EndpointAddress
O filtro EndpointAddress inspeciona o EndpointAddress no qual a mensagem foi recebida. Se o endereço em que a mensagem chega corresponde exatamente ao endereço de filtro especificado na configuração de filtro, esse filtro retornará true
. O exemplo a seguir define um FilterElement
que usa o filtro Endereço para corresponder a todas as 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);
Observação
É importante observar que a parte do nome do host de um endereço pode diferir com base em se o cliente usa o nome de domínio totalmente qualificado, o nome netBIOS, o 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 de entrada são endereçadas a um endereço exclusivo.
EndpointAddressPrefix
O filtro EndpointAddressPrefix é semelhante ao filtro EndpointAddress. O filtro EndpointAddress inspeciona o EndpointAddress no qual a mensagem foi recebida. No entanto, o filtro EndpointAddressPrefix atua como um curinga por meio de endereços correspondentes que começam com o valor especificado na configuração de filtro. O exemplo a seguir define um FilterElement
que usa o filtro EndpointAddressPrefix para corresponder a qualquer mensagem endereçada 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);
Observação
É importante observar que a parte do nome do host de um endereço pode diferir com base em se o cliente usa o nome de domínio totalmente qualificado, o nome netBIOS, o 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 no roteamento de mensagens de entrada que compartilham um prefixo de endereço comum.
AND
O filtro AND não filtra diretamente em um valor dentro de uma mensagem, mas permite que você combine dois outros filtros para criar uma condição AND
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ó corresponderão se todos os subfiltros corresponderem. O exemplo a seguir define um filtro de endereço e um filtro de ação e define um filtro AND que avalia uma mensagem em relação aos filtros de endereço e ação. Se o endereço e os filtros de 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ê tem que 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, você poderá usar um filtro AND para combinar os filtros de Ação e Endereço necessários.
Personalizado
Ao selecionar o tipo de filtro personalizado, você deverá 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, o filterData deve conter todos os valores que o filtro personalizado possa exigir na avaliação das mensagens. O exemplo a seguir define um FilterElement
que usa a implementação CustomAssembly.MyCustomMsgFilter
do MessageFilter.
<filter name="custom1" filterType="Custom" customType="CustomAssembly.MyCustomMsgFilter, CustomAssembly" filterData="Custom Data" />
MyCustomMsgFilter custom1=new MyCustomMsgFilter("Custom Data");
Se você precisar executar uma lógica de correspondência personalizada em uma mensagem que não seja coberta pelos filtros fornecidos com .NET Framework 4.6.1, crie um filtro personalizado que seja 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 realiza hash de um determinado elemento de mensagem e, em seguida, examina esse valor para determinar se o filtro deve retornar true
ou false
.
EndpointName
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 o processamento em tempo real de suas mensagens, enquanto o outro ponto de extremidade recebe mensagens cuja validade não é limitada.
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 em vez disso é um atalho conveniente que costuma ser menos propenso a erros, especialmente ao configurar um Serviço de Roteamento usando um arquivo de configuração (em que 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 tem que rotear todas as mensagens recebidas a um ponto de extremidade específico, como um serviço de registros 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 usada para inspecionar um elemento específico dentro da 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 está recebendo. O exemplo a seguir define um FilterElement
que usa o filtro XPath para inspecionar um elemento chamado "elemento" na mensagem, dentro do namespace referenciado pelo prefixo de namespace "ns".
<filter name="xpath1" filterType="XPath" filterData="//ns:element" />
XPathMessageFilter xpath1=new XPathMessageFilter("//ns:element");
Esse filtro será útil se você souber que as mensagens que você está recebendo 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, você poderá criar um filtro que usa XPath para navegar até esse cabeçalho e compara o valor presente no cabeçalho com outro dado na configuração de 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 namespaces para definir prefixos exclusivos para seus namespaces. Para obter mais informações sobre a tabela de namespaces, consulte Filtros de Mensagem.
Para obter mais informações sobre como criar consultas XPath, consulte a Sintaxe XPath.