Modelo de objeto de descoberta do WCF

A Descoberta do WCF consiste em um conjunto de tipos que fornecem um modelo de programação unificado que permite que você grave serviços detectáveis em tempo de execução e clientes que encontrem e usem esses serviços.

Tornando um serviço detectável e encontrando serviços

Para tornar um serviço WCF detectável, adicione um ServiceDiscoveryBehavior ao ServiceDescription do serviço de host e adicione um ponto de extremidade de descoberta. Se um serviço estiver configurado para enviar mensagens de anúncio (adicionando um AnnouncementEndpoint) o anúncio será enviado quando o host do serviço for aberto e fechado.

Um cliente que deseja escutar mensagens de anúncio de serviço hospeda um serviço de anúncio e adiciona um ou mais pontos de extremidade de anúncio. O serviço de anúncio recebe mensagens de anúncio e gera eventos de anúncio.

Um cliente usa a classe DiscoveryClient para pesquisar serviços disponíveis. O aplicativo cliente cria uma instância da classe DiscoveryClient, passando um ponto de extremidade de descoberta que especifica para onde enviar mensagens de descoberta. O cliente chama o método Find, que envia uma solicitação Probe. Os serviços que escutam mensagens de descoberta recebem essa solicitação Probe. Se o serviço corresponder aos critérios especificados no Probe, ele enviará uma mensagem ProbeMatch de volta ao cliente.

Modelo de Objeto

A API de Descoberta do WCF define as seguintes classes:

AnnouncementClient

A classe AnnouncementClient fornece métodos síncronos e assíncronos para enviar mensagens de anúncio. Há dois tipos de mensagens de anúncio, Hello e Bye. Uma mensagem Hello é enviada para indicar que um serviço ficou disponível e uma mensagem Bye é enviada para indicar que um serviço existente ficou indisponível. O desenvolvedor cria uma instância AnnouncementClient, passando uma instância de AnnouncementEndpoint como um parâmetro de construtor.

AnnouncementEndpoint

AnnouncementEndpoint representa um ponto de extremidade padrão com um contrato de anúncio fixo. Ele é usado por um serviço ou cliente para enviar e receber mensagens de anúncio. Por padrão, a classe AnnouncementEndpoint é definida para usar a versão do protocolo WS_Discovery 11.

AnnouncementService

AnnouncementService é uma implementação fornecida pelo sistema de um serviço de anúncio que recebe e processa mensagens de anúncio. Quando uma mensagem Hello ou Bye é recebida, a instância AnnouncementService chama o método virtual OnBeginOnlineAnnouncement ou OnBeginOfflineAnnouncement apropriado, o que gera eventos de anúncio.

DiscoveryClient

A classe DiscoveryClient é usada por um aplicativo cliente para localizar e resolver os serviços disponíveis. Ele fornece métodos síncronos e assíncronos para localizar e resolver serviços com base nos serviços FindCriteria e ResolveCriteria especificados respectivamente. O desenvolvedor cria uma instância DiscoveryClient e fornece uma instância de DiscoveryEndpoint como um parâmetro de construtor.

Para localizar um serviço, o desenvolvedor invoca o método síncrono ou assíncrono Find, que fornece uma instância FindCriteria que contém os critérios de pesquisa a serem usados. DiscoveryClient cria uma mensagem Probe com os cabeçalhos apropriados e envia a solicitação de localização. Como pode haver mais de uma solicitação pendente Find a qualquer momento, o cliente correlaciona as respostas recebidas e valida a resposta. Em seguida, ele entrega os resultados ao chamador da operação Find usando FindResponse.

Para resolver um serviço conhecido, o desenvolvedor invoca o método síncrono ou assíncrono Resolve que fornece uma instância ResolveCriteria que contém o EndpointAddress do serviço conhecido. DiscoveryClient cria a mensagem Resolve com os cabeçalhos apropriados e envia a solicitação de resolução. A resposta recebida está correlacionada com as solicitações de resolução pendentes e o resultado é entregue ao chamador da operação Resolve usando ResolveResponse.

Se um proxy de descoberta estiver presente na rede e DiscoveryClient enviar a solicitação de descoberta de forma multicast, o proxy de descoberta poderá responder com a mensagem Hello de supressão multicast. DiscoveryClient aciona o evento ProxyAvailable quando recebe mensagens Hello em resposta a solicitações Find ou Resolve pendentes. O evento ProxyAvailable contém o EndpointDiscoveryMetadata sobre o proxy de descoberta. Cabe ao desenvolvedor usar essas informações para alternar do modo Ad hoc para Gerenciado.

DiscoveryEndpoint

DiscoveryEndpoint representa um ponto de extremidade padrão com um contrato de descoberta. Ele é usado por um serviço ou cliente para enviar ou receber mensagens de descoberta. Por padrão, DiscoveryEndpoint é definido para usar o modo ServiceDiscoveryMode.Managed e a versão WSDiscovery11 WS-Discovery.

DiscoveryMessageSequenceGenerator

DiscoveryMessageSequenceGenerator é usado para gerar um DiscoveryMessageSequence quando o serviço está enviando mensagens de Descoberta ou Anúncio.

DiscoveryService

A classe abstrata DiscoveryService fornece uma estrutura para recebimento e processamento de mensagens Probe e Resolve. Quando uma mensagem Probe é recebida, DiscoveryService cria uma instância de FindRequestContext com base na mensagem de entrada e invoca o método virtual OnBeginFind. Quando uma mensagem Resolve é recebida, DiscoveryService invoca o método virtual OnBeginResolve. Você pode herdar dessa classe para fornecer uma implementação personalizada do Serviço de Descoberta.

DiscoveryProxy

A classe abstrata DiscoveryProxy fornece uma estrutura para receber e processar mensagens de descoberta e anúncio. Você herda dessa classe quando está implementando um proxy de descoberta personalizado. Quando uma mensagem Probe é recebida por multicast, a classe DiscoveryProxy chama o método virtual BeginShouldRedirectFind para determinar se uma mensagem de supressão multicast deve ser enviada. Se o desenvolvedor decidir não enviar uma mensagem de supressão multicast ou se a mensagem Probe foi recebida por unicast, ela criará uma instância da classe FindRequestContext com base na mensagem de entrada e invocará o método virtual OnBeginFind. Quando uma mensagem Resolve é recebida por multicast, A classe DiscoveryProxy chama o método virtual ShouldRedirectResolve para determinar se uma mensagem de supressão multicast deve ser enviada. Se o desenvolvedor decidir não enviar uma mensagem de supressão multicast ou se a mensagem Resolve foi recebida por unicast, ela criará uma instância da classe ResolveCriteria com base na mensagem de entrada e invocará o método virtual OnBeginResolve. Quando uma mensagem Hello ou Bye é recebida, DiscoveryProxy chama o método virtual (OnBeginOnlineAnnouncement ou OnBeingOfflineAnnouncement) apropriado, o que gera eventos de anúncio.

DiscoveryVersion

A classe DiscoveryVersion representa a versão do protocolo de descoberta a ser usada.

EndpointDiscoveryBehavior

A classe EndpointDiscoveryBehavior é usada para controlar a detectabilidade de um ponto de extremidade, especificar as extensões, nomes de tipo de contrato adicionais. e os escopos associados a esse ponto de extremidade. Esse comportamento é adicionado a um ponto de extremidade do aplicativo para configurar seu EndpointDiscoveryMetadata. Quando ServiceDiscoveryBehavior é adicionado ao host de serviço, todos os pontos de extremidade do aplicativo hospedados pelo host de serviço por padrão tornam-se detectáveis. O desenvolvedor pode desativar a descoberta de um ponto de extremidade específico definindo a propriedade Enabled como false.

EndpointDiscoveryMetadata

A classe EndpointDiscoveryMetadata fornece uma representação independente de versão de um ponto de extremidade publicado pelo serviço. Ela contém endereços de ponto de extremidade, URIs de escuta, nomes de tipo de contrato, escopos, versão de metadados e extensões especificadas pelo desenvolvedor do serviço. O FindCriteria enviado pelo cliente durante uma operação Probe é comparado com EndpointDiscoveryMetadata. Se os critérios corresponderem, EndpointDiscoveryMetadata será retornado para o cliente. O endereço do ponto de extremidade no ResolveCriteria é comparado com o endereço do ponto de extremidade de EndpointDiscoveryMetadata. Se os critérios corresponderem, EndpointDiscoveryMetadata será retornado para o cliente.

FindCriteria

A classe FindCriteria é uma classe independente de versão usada para especificar os critérios usados ao localizar um serviço. Ele dá suporte total aos critérios definidos pelo WS-Discovery para serviços correspondentes. Ele também tem extensões que os desenvolvedores podem usar para especificar valores personalizados que podem ser usados durante o processo de correspondência. O desenvolvedor pode fornecer os critérios de encerramento para a operação Find especificando o MaxResults, que especifica o número total de serviços que o desenvolvedor está procurando ou que especifica o Duration, que é o valor que especifica quanto tempo o cliente aguarda respostas.

FindRequestContext

Uma instância é criada na classe FindRequestContext pelo serviço de descoberta com base na mensagem Probe recebida quando um cliente inicia uma operação Find. Ele contém uma instância de FindCriteria que foi especificada pelo cliente.

FindResponse

A classe FindResponse é retornada ao chamador Find com as respostas da operação Find. Ela também está presente em FindCompletedEventArgs. Ele contém uma coleção de EndpointDiscoveryMetadata, que é a coleção de pontos de extremidade descobertos e um dicionário de EndpointDiscoveryMetadata e DiscoveryMessageSequence.

ResolveCriteria

A classe ResolveCriteria é uma classe independente de versão usada para especificar os critérios usados ao resolver um serviço já conhecido. Ele contém o endereço do ponto de extremidade do serviço conhecido. O desenvolvedor pode fornecer os critérios de encerramento para a operação de resolução especificando o Duration, que especifica quanto tempo o cliente aguarda respostas.

ResolveResponse

ResolveResponse é retornado ao chamador do método Resolve com a resposta da operação Resolve. Também está presente em ResolveCompletedEventArgs. Contém uma instância de EndpointDiscoveryMetadata, que são os pontos de extremidade descobertos e uma instância de DiscoveryMessageSequence.

ServiceDiscoveryBehavior

A classe ServiceDiscoveryBehavior permite que o desenvolvedor adicione o recurso de descoberta a um serviço. Você adiciona esse comportamento ao ServiceHost. A classe ServiceDiscoveryBehavior itera sobre os pontos de extremidade do aplicativo adicionados ao host de serviço e cria uma coleção de EndpointDiscoveryMetadata dos pontos de extremidade detectáveis. Todos os pontos de extremidade podem ser descobertos por padrão. A detectabilidade de um ponto de extremidade específico pode ser controlada adicionando EndpointDiscoveryBehavior ao ponto de extremidade específico. Se os pontos de extremidade de anúncio forem adicionados a ServiceDiscoveryBehavior, o anúncio de todos os pontos de extremidade detectáveis será enviado por cada um dos pontos de extremidade de anúncio quando o host do serviço for aberto ou fechado.

UdpAnnouncementEndpoint

A classe UdpAnnouncementEndpoint é um ponto de extremidade de anúncio padrão pré-configurado para anúncio em uma associação multicast UDP. Por padrão, UdpAnnouncementEndpoint é definido para usar a versão do WS_Discovery WSApril2005.

UdpDiscoveryEndpoint

A calsse UdpDiscoveryEndpoint é um ponto de extremidade de descobertas padrão pré-configurado para descoberta por meio de uma associação multicast UDP. Por padrão, DiscoveryEndpoint é definido para usar a versão WSDiscovery11 WS-Discovery e o modo ServiceDiscoveryMode.Adhoc.