Compartir a través de


Uso del canal Discovery Client

Al escribir una aplicación cliente WCF, debe conocer la dirección del punto de conexión del servicio al que llama. En muchas situaciones, la dirección del punto de conexión de un servicio no se conoce de antemano o la dirección del servicio cambia con el tiempo. El canal del cliente de detección le permite escribir una aplicación cliente de WCF y describir el servicio al que desea llamar para que el canal de cliente envíe una solicitud de análisis de forma automática. Cuando un servicio responde, el canal de cliente de detección recupera la dirección del punto de conexión del servicio de la respuesta del sondeo y la usa para llamar al servicio.

Uso del canal Discovery Client

Para utilizar el canal de cliente de detección, agregue una instancia de DiscoveryClientBindingElement a su pila del canal de cliente. Como alternativa, puede usar DynamicEndpoint y un DiscoveryClientBindingElement se agrega automáticamente a su enlace si aún no está presente.

Precaución

Se recomienda que la clase DiscoveryClientBindingElement sea el elemento de nivel superior en la pila del canal de cliente. Cualquier elemento de enlace que se agregue en un nivel superior al de DiscoveryClientBindingElement debe asegurarse de que la clase ChannelFactory o el canal que crea no utilice la dirección del extremo o la dirección Via (pasada al método CreateChannel) porque puede que no contengan la dirección correcta.

La DiscoveryClientBindingElement clase contiene dos propiedades públicas:

  1. FindCriteria, que se usa para describir el servicio al que desea llamar.

  2. DiscoveryEndpointProvider que especifica el punto de conexión de detección al que se van a enviar mensajes de detección.

La FindCriteria propiedad le permite especificar el contrato de servicio que está buscando, los URI de ámbito necesarios y el número máximo de tiempo para intentar abrir el canal. El tipo de contrato se especifica mediante una llamada al constructor FindCriteria. Los URI de ámbito se pueden agregar a la Scopes propiedad . La MaxResults propiedad permite especificar el número máximo de resultados al que el cliente intenta conectarse. Cuando se recibe una respuesta de sondeo, el cliente intenta abrir el canal mediante la dirección del punto de conexión de la respuesta del sondeo. Si se produce una excepción, el cliente pasa a la siguiente respuesta de sondeo, esperando a que se reciban más respuestas si es necesario. Sigue haciéndolo hasta que se abre correctamente el canal o se alcanza el número máximo de resultados. Para obtener más información sobre esta configuración, vea FindCriteria.

La propiedad DiscoveryEndpointProvider le permite especificar el punto de conexión de detección que desea usar. Normalmente se trata de un UdpDiscoveryEndpoint, pero puede ser cualquier punto de conexión válido.

Al crear la vinculación que se va a usar para comunicarse con el servicio, debe tener cuidado de usar exactamente la misma vinculación que el servicio. La única diferencia es que el enlace del cliente tiene una clase DiscoveryClientBindingElement en la parte superior de la pila. Si el servicio usa uno de los enlaces proporcionados por el sistema, cree un nuevo CustomBinding y pase el enlace proporcionado por el CustomBinding sistema al constructor. A continuación, puede agregar la clase DiscoveryClientBindingElement llamando Insert en la propiedad Elements.

Una vez que haya agregado DiscoveryClientBindingElement a su enlace y lo haya configurado, puede crear una instancia de la clase de cliente WCF, abrirla y llamar a sus métodos. En el ejemplo siguiente se usa el canal de cliente de detección para descubrir un servicio WCF que implementa la clase ICalculator (que se usa en el tutorial Introducción a WCF) y llama a su método Add.

// 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);  
}  

Seguridad y el canal del cliente Discovery

Al usar el canal de cliente de detección, se especifican dos puntos de conexión. Uno se utiliza para los mensajes de descubrimiento, normalmente UdpDiscoveryEndpoint, y el otro es el punto de conexión de la aplicación. Al implementar un servicio seguro, se debe tener cuidado para proteger ambos puntos de conexión. Para obtener más información sobre la seguridad, consulte Protección de servicios y clientes.