Partilhar via


Filtragem

O sistema de filtragem do Windows Communication Foundation (WCF) pode usar filtros declarativos para corresponder mensagens e tomar decisões operacionais. Você pode usar filtros para determinar o que fazer com uma mensagem examinando parte dela. Um processo de enfileiramento, por exemplo, pode usar uma consulta XPath 1.0 para verificar o elemento de prioridade de um cabeçalho conhecido para determinar se uma mensagem deve ser movida para a frente da fila.

O sistema de filtragem é composto por um conjunto de classes que podem determinar eficientemente qual de um conjunto de filtros são true para uma mensagem WCF específica.

O sistema de filtragem é um componente central das mensagens WCF; Foi concebido para ser extremamente rápido. Cada implementação de filtro foi otimizada para um tipo específico de correspondência com mensagens WCF.

O sistema de filtragem não é thread safe. O aplicativo deve manipular qualquer semântica de bloqueio. No entanto, suporta um escritor único e multi-leitor.

Onde a filtragem se encaixa

A filtragem é realizada depois que uma mensagem é recebida e faz parte do processo de envio da mensagem para o componente de aplicativo adequado. O design do sistema de filtragem atende aos requisitos de vários subsistemas WCF, incluindo mensagens, roteamento, segurança, manipulação de eventos e gerenciamento do sistema.

Filtros

O mecanismo de filtro tem dois componentes principais, filtros e tabelas de filtros. Um filtro toma decisões booleanas sobre uma mensagem com base em condições lógicas especificadas pelo usuário. Os filtros implementam a MessageFilter classe.

Os Match métodos são usados para determinar se uma mensagem satisfaz um filtro. Um dos métodos testa o cabeçalho da mensagem, mas não pode inspecionar o corpo da mensagem. O outro método usa um buffer de mensagens como um parâmetro de entrada e pode inspecionar o corpo da mensagem.

Os filtros geralmente não são testados individualmente, mas como parte de uma tabela de filtros, que é uma classe genérica que o CreateFilterTable método cria.

Os vários tipos de filtros especializam-se em combinar em um tipo particular de condição booleana. Depois de construir um filtro, você não pode alterar os critérios que um filtro usa; Para modificar os critérios de um filtro, construa um novo e exclua o filtro existente.

Filtros de ação

O ActionMessageFilter contém uma lista de cadeias de caracteres de ação. Se qualquer uma das ações na lista do filtro corresponder ao cabeçalho Action no buffer de mensagens ou mensagens, o Match método retornará true. Se a lista estiver vazia, o filtro é considerado um filtro de correspondência de todos e qualquer mensagem ou buffer de mensagens corresponde e Match retorna true. Se nenhuma das ações na lista do filtro corresponder ao cabeçalho Ação no buffer de mensagens ou mensagens, Match retornará false. Se não houver nenhuma ação na mensagem e a lista do filtro não estiver vazia, retornará Matchfalse.

Filtros de Endereço de Ponto Final

O EndpointAddressMessageFilter filtra mensagens e buffers de mensagens com base em um endereço de ponto de extremidade, conforme representado em sua coleção de cabeçalhos. Para que uma mensagem passe por esse filtro, as seguintes condições devem ser atendidas:

  • O URI (Uniform Resource Identifier) do filtro deve ser o mesmo do cabeçalho da mensagem Para.

  • Cada parâmetro de ponto final no endereço do filtro (address.Headers coleção) deve encontrar um cabeçalho na mensagem para mapeamento. Cabeçalhos extras no buffer de mensagens são aceitáveis para que a correspondência permaneça true.

Filtros de endereço de ponto de extremidade de prefixo

  1. As PrefixEndpointAddressMessageFilter funções assim como o EndpointAddressMessageFilter filtro, exceto que a correspondência pode estar em um prefixo do URI da mensagem. Por exemplo, um filtro que especifica o endereço http://www.adatum.com corresponde às mensagens endereçadas ao http://www.adatum.com/userA.

Filtros de mensagem XPath

Um XPathMessageFilter usa uma expressão XPath para determinar se um documento XML contém elementos específicos, atributos, texto ou outras construções sintáticas XML. O filtro é otimizado para ser extremamente eficiente para um subconjunto rigoroso de XPath. A linguagem de caminho XML é descrita na especificação W3C XML Path Language 1.0.

Normalmente, um aplicativo usa um XPathMessageFilter em um ponto de extremidade para consultar o conteúdo de uma mensagem SOAP e, em seguida, executa a ação apropriada com base nos resultados dessa consulta. Um processo de enfileiramento, por exemplo, pode usar uma consulta XPath para inspecionar o elemento de prioridade de um cabeçalho conhecido para decidir se deseja mover uma mensagem para a frente da fila.

Tabelas de Filtros

As tabelas de filtro são usadas para armazenar pares chave-valor, onde um filtro é a chave e alguns dados associados são o valor. Os dados de filtro podem ser usados para indicar quais ações devem ser tomadas se uma mensagem corresponder ao filtro e o tipo de dados de filtro for o parâmetro genérico para a classe de tabela de filtro. Os dados do filtro podem consistir em regras de roteamento, estado de segurança da sessão, ouvintes em um canal e assim por diante. Os dados podem ser usados onde o controle de fluxo de dados é necessário.

As tabelas de filtro implementam a interface IMessageFilterTable<TFilterData>genérica.

As tabelas de filtros têm vários métodos que correspondem a uma mensagem a todos os filtros da tabela e retornam uma coleção não ordenada de filtros ou dados correspondentes. Alguns dos métodos de correspondência são de correspondência múltipla e devolvem todos os itens correspondentes. Outros são single-match, retornando apenas um item, e lançar um MultipleFilterMatchesException se mais de um filtro matches.

Tabela de Filtro de Mensagens

A MessageFilterTable<TFilterData> é a implementação mais geral do IMessageFilterTable<TFilterData>. Você pode armazenar filtros de todos os tipos na tabela.

Você pode atribuir prioridades numéricas a filtros, onde a prioridade mais alta é representada pelo número mais alto. Vários tipos de filtros podem ter a mesma prioridade. Um determinado tipo de filtro pode aparecer em mais de um nível de prioridade.

A correspondência é feita começando com a prioridade mais alta e, uma vez que os filtros de correspondência são encontrados com uma determinada prioridade, nenhum filtro com prioridades mais baixas é examinado. Portanto, se você estiver usando um método de correspondência de filtro único e mais de um filtro corresponder a uma mensagem, mas cada filtro correspondente tiver uma prioridade diferente, nenhuma exceção será lançada e o filtro com a prioridade mais alta será retornado. Da mesma forma, um método de correspondência de vários filtros retorna apenas os filtros correspondentes com a prioridade mais alta.

Tabela de Filtro de Mensagens XPath

O XPathMessageFilterTable<TFilterData> é otimizado para filtros XPath declarativos, portanto, a chave da tabela é um XPathMessageFilterarquivo .

A XPathMessageFilterTable<TFilterData> classe otimiza a correspondência para um subconjunto de XPath que cobre a maioria dos cenários de mensagens e também suporta a gramática XPath 1.0 completa. Otimizou algoritmos para uma correspondência paralela eficiente.

Esta tabela tem vários métodos especializados Match que operam sobre um XPathNavigator e um SeekableXPathNavigator. A SeekableXPathNavigator estende a XPathNavigator classe adicionando uma CurrentPosition propriedade. Essa propriedade permite que as posições dentro do documento XML sejam salvas e carregadas rapidamente sem ter que clonar o navegador, uma alocação de memória cara que o XPathNavigator requer para tal operação. O mecanismo WCF XPath deve freqüentemente registrar a posição do cursor durante a execução de consultas em documentos XML, portanto, fornece uma otimização importante para o SeekableXPathNavigator processamento de mensagens.

Cenários do Cliente

Você pode usar a filtragem sempre que quiser enviar uma mensagem para diferentes módulos de processamento, dependendo dos dados contidos na mensagem. Dois cenários típicos são o roteamento de uma mensagem com base em seu código de ação e a desmultiplexação de um fluxo de mensagens com base no endereço de ponto final das mensagens.

Encaminhamento

O ouvinte de um ponto de extremidade escuta mensagens que têm um ou mais códigos de ação no cabeçalho SOAP da mensagem. Você implementa isso criando um ActionMessageFilter passando uma matriz que contém os códigos de ação para seu construtor. Ele usa esse filtro para se registrar com o ListenerFactory, para que apenas as mensagens cuja ação corresponda a uma das do filtro cheguem a esse ponto de extremidade específico.

Desmultiplexação

Quando vários endpoints se afastam do mesmo ServiceListener off-wire, a única maneira de desmultiplexar mensagens e saber se elas pertencem a um determinado endereço de ponto final, é usar EndpointAddressMessageFilters, que selecionam mensagens em direção aos pontos de extremidade registrados, realizando uma pesquisa nas informações armazenadas nos cabeçalhos. Nestes filtros, apenas as mensagens que passam têm todos os cabeçalhos necessários que correspondem a ambos:

  • O URI no EndpointAddress.

  • O restante dos parâmetros do ponto final no EndpointAddress conforme especificado no EndpointAddressMessageFilter.

Consulte também