Usando o Discovery Client Channel

Ao escrever um aplicativo cliente WCF, você precisa saber o endereço do ponto de extremidade do serviço que está chamando. Em muitas situações, o endereço do ponto final de um serviço não é conhecido com antecedência ou o endereço do serviço muda ao longo do tempo. O Discovery Client Channel permite que você escreva um aplicativo cliente WCF, descreva o serviço que você deseja chamar e o canal do cliente envia automaticamente uma solicitação de teste. Quando um serviço responde, o canal do cliente de descoberta recupera o endereço do ponto de extremidade do serviço da resposta do teste e o usa para chamar o serviço.

Usando o Discovery Client Channel

Para usar o Discovery Client Channel, adicione uma instância do DiscoveryClientBindingElement à pilha de canais do cliente. Como alternativa, você pode usar o e a DiscoveryClientBindingElement é adicionado automaticamente à sua vinculação, DynamicEndpoint se ainda não estiver presente.

Atenção

Recomenda-se que o DiscoveryClientBindingElement seja o elemento mais alto na pilha de canais do cliente. Qualquer elemento de vinculação que é adicionado sobre o DiscoveryClientBindingElement deve certificar-se de que o ChannelFactory ou canal que ele cria não usa o endereço do ponto de extremidade ou Via endereço (passado para o CreateChannel método) porque eles podem não conter o endereço correto.

A DiscoveryClientBindingElement classe contém duas propriedades públicas:

  1. FindCriteria, que é utilizado para descrever o serviço para o qual pretende ligar.

  2. DiscoveryEndpointProvider que especifica o ponto de extremidade de descoberta para o qual enviar mensagens de descoberta.

A FindCriteria propriedade permite que você especifique o contrato de serviço que você está procurando, quaisquer URIs de escopo necessários e o número máximo de tempo para tentar abrir o canal. O tipo de contrato é especificado chamando o construtor FindCriteria. Os URIs de escopo podem ser adicionados à Scopes propriedade. A MaxResults propriedade permite especificar o número máximo de resultados aos quais o cliente tenta se conectar. Quando uma resposta de teste é recebida, o cliente tenta abrir o canal usando o endereço do ponto de extremidade da resposta da sonda. Se ocorrer uma exceção, o cliente passa para a próxima resposta de teste, aguardando que mais respostas sejam recebidas, se necessário. Ele continua a fazer isso até que o canal é aberto com sucesso ou o número máximo de resultados é atingido. Para obter mais informações sobre essas configurações, consulte FindCriteria.

A DiscoveryEndpointProvider propriedade permite especificar o ponto de extremidade de descoberta a ser usado. Normalmente, este é um UdpDiscoveryEndpoint, mas pode ser qualquer ponto de extremidade válido.

Ao criar a associação a ser usada para se comunicar com o serviço, você deve ter cuidado para usar exatamente a mesma associação que o serviço. A única diferença é que a ligação do cliente tem um DiscoveryClientBindingElement na parte superior da pilha. Se o serviço estiver usando uma das associações fornecidas pelo sistema, crie uma nova CustomBinding e passe a ligação fornecida pelo sistema para o CustomBinding construtor. Em seguida, você pode adicionar o DiscoveryClientBindingElement chamando Insert a Elements propriedade.

Depois de adicionar o DiscoveryClientBindingElement à sua associação e configurá-lo, você pode criar uma instância da classe de cliente WCF, abri-lo e chamar seus métodos. O exemplo a seguir usa o Discovery Client Channel para descobrir um serviço WCF que implementa a ICalculator classe (usada no tutorial Getting Started WCF) e chama seu Add método.

// Create the DiscoveryClientBindingElement  
DiscoveryClientBindingElement bindingElement = new DiscoveryClientBindingElement();  
// Search for a service that implements the ICalculator interface, attempting to open  
// the channel a maximum of 2 times  
bindingElement.FindCriteria = new FindCriteria(typeof(ICalculator)) { MaxResults = 2 };  
// Use the UdpDiscoveryEndpoint  
bindingElement.DiscoveryEndpoint = new UdpDiscoveryEndpoint();  
  
// The service uses the BasicHttpBinding, so use that and insert the DiscoveryClientBindingElement at the
// top of the stack  
CustomBinding binding = new CustomBinding(new BasicHttpBinding());  
binding.Elements.Insert(0,bindingElement);  
  
try  
{  
    // Create the WCF client and call a method  
    CalculatorClient client = new CalculatorClient(binding, new EndpointAddress("http://schemas.microsoft.com/dynamic"));  
    client.Open();  
    client.Add(1, 1);  
}  
catch (EndpointNotFoundException ex)  
{  
    Console.WriteLine("An exception occurred: " + ex.Message);  
}  

Segurança e o canal Discovery Client

Ao usar o canal do cliente de descoberta, dois pontos de extremidade estão sendo especificados. Um é usado para mensagens de descoberta, geralmente UdpDiscoveryEndpoint, e o outro é o ponto de extremidade do aplicativo. Ao implementar um serviço seguro, deve-se tomar cuidado para proteger ambos os endpoints. Para obter mais informações sobre segurança, consulte Protegendo serviços e clientes.