Compartilhar via


Serviço de roteamento

O serviço de roteamento é um intermediário genérico do SOAP que atua como um roteador de mensagem. A principal funcionalidade do serviço de roteamento é a capacidade de rotear mensagens com base no conteúdo da mensagem, que permite que uma mensagem seja encaminhada para um ponto de extremidade do cliente com base em um valor dentro da própria mensagem, no cabeçalho ou no corpo da mensagem.

O RoutingService é implementado como um serviço WCF (Windows Communication Foundation) no namespace System.ServiceModel.Routing. O serviço de roteamento expõe um ou mais pontos de extremidade de serviço que recebem mensagens e roteia cada mensagem para um ou mais pontos de extremidade do cliente com base no conteúdo da mensagem. O serviço fornece os recursos a seguir:

  • Roteamento baseado em conteúdo

    • Agregação de serviço

    • Controle de versão de serviço

    • Roteamento de prioridade

    • Configuração dinâmica

  • Ponte de protocolo

  • Processamento SOAP

  • Tratamento avançado de erro

  • Pontos de extremidade de backup

Embora seja possível criar um serviço intermediário que cumpra uma ou mais dessas metas, muitas vezes essa implementação está vinculada a um cenário ou solução específico e não pode ser aplicada prontamente a novos aplicativos.

O serviço de roteamento fornece um intermediário genérico do SOAP, configurável dinamicamente que é compatível com os modelos de serviço e canal do WCF e permite que você execute o roteamento baseado em conteúdo de mensagens baseadas no SOAP.

Observação

Atualmente, o serviço de eroteamento não dá suporte ao roteamento de serviços REST do WCF. Para rotear chamadas REST, considere usar System.Web.Routing ou Application Request Routing.

Roteamento baseado em conteúdo

O roteamento baseado em conteúdo é a capacidade de rotear uma mensagem com base em um ou mais valores contidos na mensagem. O serviço de roteamento inspeciona cada mensagem e a encaminha para o ponto de extremidade de destino com base no conteúdo da mensagem e na lógica de roteamento que você cria. O roteamento baseado em conteúdo fornece a base para agregação de serviço, controle de versão do serviço e roteamento de prioridade.

Para implementar o roteamento baseado em conteúdo, o serviço de roteamento depende de implementações MessageFilter que são usadas para corresponder a valores específicos dentro das mensagens a serem roteadas. Se um MessageFilter corresponder a uma mensagem, a mensagem será roteada para o ponto de extremidade de destino associado ao MessageFilter. Os filtros de mensagem são agrupados em tabelas de filtro (FilterTableCollection) para construir lógica de roteamento complexa. Por exemplo, uma tabela de filtro pode conter cinco filtros de mensagem mutuamente exclusivos que fazem com que as mensagens sejam roteadas para apenas um dos cinco pontos de extremidade de destino.

O serviço de roteamento permite configurar a lógica usada para executar o roteamento baseado em conteúdo, bem como atualizar dinamicamente a lógica de roteamento em tempo de execução.

Por meio do agrupamento de filtros de mensagem em tabelas de filtro, a lógica de roteamento pode ser construída, permitindo que você manipule vários cenários de roteamento, como:

  • Agregação de serviço

  • Controle de versão de serviço

  • Roteamento de prioridade

  • Configuração dinâmica

Para obter mais informações sobre filtros de mensagens e tabelas de filtro, consulte Introdução ao roteamento e Filtros de mensagens.

Agregação de serviço

Usando o roteamento baseado em conteúdo, você pode expor um ponto de extremidade que recebe mensagens de aplicativos de clientes externos e roteia cada mensagem para o ponto de extremidade interno apropriado com base em um valor dentro da mensagem. Isso é útil para oferecer um ponto de extremidade específico para uma variedade de aplicativos de back-end e, também, para apresentar um ponto de extremidade de aplicativo aos clientes, enquanto coloca seu aplicativo em vários serviços.

Controle de versão de serviço

Ao migrar para uma nova versão da sua solução, talvez seja necessário manter a versão antiga em paralelo para atender aos clientes existentes. Geralmente, isso requer que os clientes que se conectam à versão mais recente precisem usar um endereço diferente ao se comunicar com a solução. O serviço de roteamento permite expor um ponto de extremidade de serviço que atenda às duas versões da sua solução roteando mensagens para a solução apropriada com base nas informações específicas da versão contidas na mensagem. Para obter um exemplo dessa implementação, consulte Como fazer o controle de versão de serviço.

Roteamento de prioridade

Ao fornecer um serviço para vários clientes, você pode ter um SLA (contrato de nível de serviço) com alguns parceiros, que exige que todos os dados desses parceiros sejam processados separadamente dos de outros clientes. Usando um filtro que procura informações específicas do cliente contidas na mensagem, você pode rotear facilmente mensagens de parceiros específicos para um ponto de extremidade que tenha sido criado para atender aos requisitos do SLA.

Configuração dinâmica

Para dar suporte a sistemas críticos, em que as mensagens devem ser processadas sem interrupções de serviço, é vital que você seja capaz de modificar a configuração de componentes dentro do sistema em tempo de execução. Para dar suporte a essa necessidade, o serviço de roteamento fornece uma implementação IExtension<T>, o RoutingExtension, que permite a atualização dinâmica da configuração do serviço de roteamento em tempo de execução.

Para obter mais informações sobre a configuração dinâmica do serviço de roteamento, consulte Introdução ao roteamento.

Ponte de protocolo

Um dos desafios em cenários intermediários é que os pontos de extremidade internos podem ter requisitos de transporte ou de versão de SOAP diferentes do ponto de extremidade no qual as mensagens são recebidas. Para dar suporte a esse cenário, o serviço de roteamento pode fazer a ponte de protocolos, incluindo o processamento da mensagem SOAP para o MessageVersion exigido pelo(s) ponto(s) de extremidade de destino. Dessa forma, um protocolo pode ser usado para comunicação interna, enquanto outro pode ser usado para comunicação externa.

Para dar suporte ao roteamento de mensagens entre pontos de extremidade com transportes diferentes, o serviço de roteamento usa associações fornecidas pelo sistema que permitem que o serviço faça a ponte de protocolos diferentes. Isso ocorre automaticamente quando o ponto de extremidade de serviço exposto pelo serviço de roteamento usa um protocolo diferente dos pontos de extremidade do cliente para os quais as mensagens são roteadas.

Processamento SOAP

Um requisito de roteamento comum é a capacidade de rotear mensagens entre pontos de extremidade com requisitos de SOAP diferentes. Para dar suporte a esse requisito, o serviço de roteamento fornece um SoapProcessingBehavior que cria automaticamente uma nova MessageVersion que atende aos requisitos do ponto de extremidade de destino antes que a mensagem seja roteada para ele. Esse comportamento também cria uma nova MessageVersion para qualquer mensagem de resposta antes de devolvê-la ao aplicativo cliente solicitante, a fim de garantir que a MessageVersion da resposta corresponda à da solicitação original.

Para obter mais informações sobre o processamento SOAP, consulte Introdução ao roteamento.

Tratamento de erros

Em um sistema composto por serviços distribuídos que dependem de comunicações de rede, é importante garantir que as comunicações em seu sistema sejam resistentes a falhas transitórias de rede. O serviço de roteamento implementa o tratamento de erros que permite tratar muitos cenários de falha de comunicação que, de outra forma, podem resultar em uma interrupção de serviço.

Se o serviço de roteamento encontrar um CommunicationException enquanto tenta enviar uma mensagem, os ocorrerá o tratamento de erros. Essas exceções normalmente indicam que um problema foi encontrado ao tentar se comunicar com o ponto de extremidade do cliente definido, como um EndpointNotFoundException, ServerTooBusyException ou CommunicationObjectFaultedException. O código de tratamento de erros também capturará e tentará repetir o envio quando ocorrer um TimeoutException, que é outra exceção comum que não é derivada de CommunicationException.

Para obter mais informações sobre tratamento de erro, consulte Introdução ao roteamento.

Pontos de extremidade de backup

Além dos pontos de extremidade do cliente de destino associados a cada definição de filtro na tabela de filtro, você também pode criar uma lista de pontos de extremidade de backup para os quais a mensagem será roteada em caso de falha de transmissão. Se ocorrer um erro e uma lista de backup for definida para a entrada de filtro, o serviço de roteamento tentará enviar a mensagem para o primeiro ponto de extremidade definido na lista. Se essa tentativa de transmissão falhar, o serviço tentará o próximo ponto de extremidade e continuará esse processo até que a tentativa de transmissão seja bem-sucedida, retorne um erro não relacionado à transmissão ou todos os pontos de extremidade na lista de backup retornaram um erro de transmissão.

Para obter mais informações sobre pontos de extremidade de backup, consulte Introdução ao roteamento e Filtros de mensagem.

Streaming

O serviço de roteamento poderá transmitir mensagens com êxito se você definir a associação para dar suporte ao streaming. No entanto, há algumas condições nas quais as mensagens podem precisar ser armazenadas em buffer:

  • Multicast (buffer para criar cópias de mensagens adicionais)

  • Failover (buffer caso a mensagem precise ser enviada para um backup)

  • System.ServiceModel.Routing.RoutingConfiguration.RouteOnHeadersOnly é false (buffer para apresentar o MessageFilterTable com um MessageBuffer para que os filtros possam inspecionar o corpo)

  • Configuração dinâmica

Confira também