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 sistema de filtragem WCF (Windows Communication Foundation) 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 da mensagem. 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 pode determinar com eficiência qual de um conjunto de filtros é true para uma mensagem WCF específica.
O sistema de filtragem é um componente principal do sistema de mensagens WCF; ele foi projetado 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 lidar com qualquer semântica de bloqueio. No entanto, ele oferece suporte a múltiplos leitores e um único escritor.
Onde a filtragem se encaixa
A filtragem é executada depois que uma mensagem é recebida e faz parte do processo de expedição 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, tratamento de eventos e gerenciamento do sistema.
Filtros
O mecanismo de filtro tem dois componentes primários, filtros e tabelas de filtro. Um filtro toma decisões boolianas 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 mensagem 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 filtro, que é uma classe genérica que o CreateFilterTable método cria.
Os vários tipos de filtros são especializados em adequar-se a um tipo específico de condição booleana. Depois de construir um filtro, você não poderá alterar os critérios usados por um filtro; 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 strings de ação. Se qualquer uma das ações na lista do filtro corresponder ao cabeçalho Ação na mensagem ou buffer de mensagem, o Match método retornará true. Se a lista estiver vazia, o filtro será considerado um filtro de correspondência de tudo e qualquer mensagem ou buffer de mensagens será correspondente e Match retornará true. Se nenhuma das ações na lista do filtro corresponder ao cabeçalho Ação na mensagem ou no buffer de 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 do ponto de extremidade
O EndpointAddressMessageFilter filtra as mensagens e os buffers de mensagens com base em um endereço de ponto de extremidade, conforme representado na coleção de cabeçalhos. Para que uma mensagem passe esse filtro, as seguintes condições devem ser atendidas:
O URI (Uniform Resource Identifier) do endereço do filtro precisa ser o mesmo que aquele no cabeçalho da mensagem Para.
Cada parâmetro de ponto de extremidade no endereço do filtro (coleção
address.Headers) precisa encontrar um cabeçalho na mensagem para mapeamento. Os cabeçalhos extras na mensagem ou no buffer de mensagens são aceitáveis para que a correspondência permaneçatrue.
Filtros de endereço do ponto de extremidade de prefixo
- As funções PrefixEndpointAddressMessageFilter são semelhantes ao filtro EndpointAddressMessageFilter, com a exceção de 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.comcorresponde às mensagens endereçadas ahttp://www.adatum.com/userA.
Filtros de mensagem XPath
Um XPathMessageFilter usa uma expressão XPath para determinar se um documento XML contém elementos, atributos, texto ou outros constructos sintacticos XML específicos. O filtro é otimizado para ser extremamente eficiente para um subconjunto estrito do 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 então toma a ação apropriada com base nos resultados da 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.
Filtrar Tabelas
As tabelas de filtro são usadas para armazenar pares chave-valor, em que um filtro é a chave e alguns dados associados são o valor. Os dados de filtro podem ser usados para indicar quais ações executar 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 de filtro podem consistir em regras de roteamento, estado de segurança de 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 filtro têm vários métodos que confrontam uma mensagem contra todos os filtros na tabela e retornam uma coleção não ordenada de filtros correspondentes ou dados. Alguns dos métodos de correspondência são de correspondência múltipla e retornam todos os itens correspondentes. Outros são de correspondência única, retornando apenas um item e geram uma MultipleFilterMatchesException se mais de um filtro é correspondente.
Tabela de Filtro de Mensagem
A MessageFilterTable<TFilterData> é a implementação mais geral de IMessageFilterTable<TFilterData>. Você pode armazenar filtros de todos os tipos na tabela.
Você pode atribuir prioridades numéricas a filtros, em que a prioridade mais alta é assinada pelo número mais alto. Vários tipos de filtros podem ter a mesma prioridade. Um tipo específico de filtro pode aparecer em mais de um nível de prioridade.
A correspondência é feita começando com a prioridade mais alta e, depois que os filtros correspondentes forem encontrados com uma determinada prioridade, nenhum filtro com prioridades mais baixas será 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á gerada e o filtro com a prioridade mais alta será retornado. Da mesma forma, um método de correspondência de vários filtros retorna somente os filtros correspondentes com a prioridade mais alta.
Tabela de filtro de mensagem XPath
O XPathMessageFilterTable<TFilterData> recurso é otimizado para filtros XPath declarativos, portanto, a chave da tabela é um XPathMessageFilter.
A XPathMessageFilterTable<TFilterData> classe otimiza a correspondência para um subconjunto de XPath que abrange a maioria dos cenários de mensagens e também dá suporte à gramática XPath 1.0 completa. Ele tem algoritmos otimizados para correspondência paralela eficiente.
Esta tabela tem vários métodos especializados Match que operam sobre um XPathNavigator e um SeekableXPathNavigator. Um 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 a necessidade de clonar o navegador, uma alocação de memória cara que o XPathNavigator requer para tal operação. O mecanismo XPath do WCF deve registrar frequentemente a posição do cursor no curso da execução de consultas em documentos XML, portanto, fornece SeekableXPathNavigator uma otimização importante para o 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 rotear mensagens com base no seu código de ação e demultiplexar um fluxo de mensagens com base no endereço de destino das mensagens.
Roteamento
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 e passando uma matriz que contém os códigos de ação para seu construtor. Ele usa esse filtro para se registrar no ListenerFactory, ou seja, somente as mensagens cuja ação corresponde a uma daquelas no filtro chega a esse ponto de extremidade específico.
Desfazer a multiplexação
Quando é feito o fan-out de vários pontos de extremidade do mesmo ServiceListener, a única maneira de desfazer a multiplexação de mensagens e saber se elas pertencem a determinado endereço de ponto de extremidade é usar EndpointAddressMessageFilters, que selecionam mensagens em direção aos pontos de extremidade registrados executando uma pesquisa nas informações armazenadas nos cabeçalhos. Nesses filtros, somente as mensagens que passam têm todos os cabeçalhos necessários que correspondem a ambos:
URI no
EndpointAddress.Restante dos parâmetros de ponto de extremidade no
EndpointAddress, conforme especificado no EndpointAddressMessageFilter.