Critérios de localização personalizados
O exemplo de CustomFindCriteria demonstra como criar uma correspondência de escopo personalizada usando a lógica e como implementar um serviço de descoberta personalizada. Os clientes usam a funcionalidade de correspondência de escopo personalizada para refinar e compilar ainda mais os resultados com base na funcionalidade de localização fornecida pelo sistema da Descoberta do WCF. O cenário que este exemplo aborda é o seguinte:
Um cliente está procurando um serviço de calculadora.
Para refinar a pesquisa, o cliente precisa usar uma regra de correspondência de escopo personalizada.
De acordo com essa regra, um serviço responderá novamente ao cliente se o ponto de extremidade corresponder a um dos escopos especificados pelo cliente.
Demonstra
Como criar um serviço de descoberta personalizada.
Como implementar uma correspondência de escopo personalizada por algoritmo.
Discussão
O cliente está procurando critérios de correspondência do tipo "OR". Um serviço responderá se os escopos nos pontos de extremidade corresponderem a um dos escopos fornecidos pelo cliente. Nesse caso, o cliente está procurando um serviço de calculadora que tenha um dos escopos na seguinte lista:
net.tcp://Microsoft.Samples.Discovery/RedmondLocation
net.tcp://Microsoft.Samples.Discovery/SeattleLocation
net.tcp://Microsoft.Samples.Discovery/PortlandLocation
Para fazer isso, o cliente orienta os serviços a usar uma regra de correspondência de escopo personalizada transmitindo uma correspondência de escopo personalizada por URI. Para facilitar a correspondência de escopo personalizada, o serviço precisa usar um serviço de descoberta personalizada que entenda a regra de correspondência de escopo personalizada e implemente a lógica de correspondência associada.
No projeto do cliente, abra o arquivo Program.cs. Observe que o campo ScopeMatchBy
do objeto FindCriteria
está definido como um URI específico. Esse identificador é enviado ao serviço. Se o serviço não entender essa regra, ele vai ignorar a solicitação de localização do cliente.
Abra o projeto de serviço. Três arquivos são usados para implementar o Serviço de Descoberta Personalizada:
AsyncResult.cs: essa é a implementação do
AsyncResult
que é exigido pelos métodos Discovery.CustomDiscoveryService.cs: esse arquivo implementa o serviço de descoberta personalizada. A implementação estende a classe DiscoveryService e substitui os métodos necessários. Observe a implementação do método OnBeginFind. O método verifica se o escopo personalizado corresponde à regra especificada pelo cliente. Esse é o mesmo URI personalizado especificado anteriormente pelo cliente. Se a regra personalizada for especificada, o caminho do código que implementa a lógica de correspondência "OR" será seguido.
Essa lógica personalizada percorre todos os escopos em cada um dos pontos de extremidade que o serviço tem. Se um dos escopos do ponto de extremidade corresponder a um dos escopos fornecidos pelo cliente, o serviço de descoberta adicionará esse ponto de extremidade à resposta enviada novamente ao cliente.
CustomDiscoveryExtension.cs: a última etapa na implementação do serviço de descoberta é conectar essa implementação do serviço de descoberta personalizada ao host de serviço. A classe auxiliar usada aqui é a classe
CustomDiscoveryExtension
. Essa classe estende a classe DiscoveryServiceExtension. O usuário precisa substituir o método GetDiscoveryService. Nesse caso, o método retorna uma instância do serviço de descoberta personalizada que foi criado antes.PublishedEndpoints
é uma ReadOnlyCollection<T> que contém todos os pontos de extremidade do aplicativo que são adicionados ao ServiceHost. O serviço de descoberta personalizada usa isso para preencher a lista interna. Um usuário também pode adicionar outros metadados de ponto de extremidade.
Por fim, abra Program.cs. Observe que o ServiceDiscoveryBehavior e a CustomDiscoveryExtension
foram adicionados ao host. Depois que isso for feito e o host tiver um ponto de extremidade no qual receberá as mensagens de descoberta, o aplicativo poderá usar o serviço de descoberta personalizada.
Observe que o cliente pode localizar o serviço sem saber o endereço dele.
Para configurar, compilar, e executar o exemplo
Abra a solução que contém o projeto.
Compile o projeto.
Execute o aplicativo de serviço.
Execute o aplicativo cliente.