Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este ejemplo se muestra cómo utilizar el elemento de enlace de cliente de detección para detectar un servicio. Esta característica permite a los desarrolladores de software agregar un canal de cliente de detección a su pila del canal de clientes existente, con lo que el modelo de programación resulta muy intuitivo. Cuando se abre el canal asociado, la dirección del servicio se resuelve utilizando la detección. Este ejemplo consta de los siguientes proyectos:
CalculatorService: un servicio de WCF que se puede detectar.
CalculatorClient: una aplicación cliente de WCF que utiliza el canal de cliente de detección para buscar y llamar a CalculatorService.
DynamicCalculatorClient: una aplicación cliente de WCF que utiliza un extremo dinámico para buscar y llamar a CalculatorService.
![]() |
---|
Puede que los ejemplos ya estén instalados en su equipo. Compruebe el siguiente directorio (valor predeterminado) antes de continuar.
<InstallDrive>:\WF_WCF_Samples
Si no existe este directorio, vaya a la página de ejemplos de Windows Communication Foundation (WCF) y Windows Workflow Foundation (WF) Samples para .NET Framework 4 para descargar todos los ejemplos de Windows Communication Foundation (WCF) y WF. Este ejemplo se encuentra en el siguiente directorio.
<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Discovery\DiscoveryBindingElement
|
CalculatorService
Este proyecto contiene un servicio de calculadora sencillo que implementa el contrato de la interfaz ICalculatorService
.
El siguiente archivo App.config se utiliza para agregar un comportamiento <serviceDiscovery> en los comportamientos del servicio, así como el extremo de detección.
<system.serviceModel>
<services>
<service behaviorConfiguration="CalculatorBehavior" name="Microsoft.Samples.Discovery.CalculatorService">
<endpoint name="udpDiscoveryEpt" kind="udpDiscoveryEndpoint" />
</service>
</services>
<behaviors>
<!--Enable discovery through configuration.-->
<serviceBehaviors>
<behavior name="CalculatorBehavior">
<serviceDiscovery>
</serviceDiscovery>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Esto hace que el servicio y sus extremos se puedan detectar. CalculatorService es un servicio autohospedado que agrega un extremo mediante el enlace NetTcpBinding. También agrega un EndpointDiscoveryBehavior
al extremo y especifica un ámbito como se muestra en el siguiente código.
// Add a NET.TCP endpoint and add a scope to that endpoint.
ServiceEndpoint netTcpEndpoint = serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new NetTcpBinding(), netTcpAddress);
EndpointDiscoveryBehavior netTctEndpointBehavior = new EndpointDiscoveryBehavior();
netTctEndpointBehavior.Scopes.Add(new Uri("ldap:///ou=engineering,o=exampleorg,c=us"));
netTcpEndpoint.Behaviors.Add(netTctEndpointBehavior);
serviceHost.Open();
CalculatorClient
Este proyecto contiene una implementación del cliente que envía los mensajes a CalculatorService. Este programa utiliza el método CreateCustomBindingWithDiscoveryElement()
para crear un enlace personalizado que utiliza el canal de cliente de detección.
static CustomBinding CreateCustomBindingWithDiscoveryElement()
{
DiscoveryClientBindingElement discoveryBindingElement = new DiscoveryClientBindingElement();
// Provide the search criteria and the endpoint over which the probe is sent
discoveryBindingElement.FindCriteria = new FindCriteria(typeof(ICalculatorService));
discoveryBindingElement.DiscoveryEndpointProvider = new UdpDiscoveryEndpointProvider();
CustomBinding customBinding = new CustomBinding(new NetTcpBinding());
// Insert DiscoveryClientBindingElement at the top of the BindingElement stack.
// An exception is thrown if this binding element is not at the top
customBinding.Elements.Insert(0, discoveryBindingElement);
return customBinding; }
Una vez creado el objeto DiscoveryClientBindingElement, el desarrollador de software especifica los criterios que se usan al buscar un servicio. En este caso, el criterio de búsqueda de detección es el tipo de la interfaz ICalculatorService
. Además, el desarrollador de software especifica un DiscoveryEndpointProvider que devuelve un DiscoveryEndpoint que especifica dónde buscar los servicios. El DiscoveryEndpointProvider devuelve una nueva instancia de DiscoveryEndpoint. Para obtener más información, vea Utilizar un enlace personalizado con el canal del cliente de detección.
// Extend DiscoveryEndpointProvider class to change the default DiscoveryEndpoint
// to the DiscoveryClientBindingElement. The Discovery ClientChannel
// uses this endpoint to send Probe message.
public class UdpDiscoveryEndpointProvider : DiscoveryEndpointProvider
{
public override DiscoveryEndpoint GetDiscoveryEndpoint()
{
return new UdpDiscoveryEndpoint(DiscoveryVersion.WSDiscoveryApril2005);
}
}
En este caso, el cliente utiliza el mecanismo de multidifusión de UDP definido por el protocolo de detección para buscar los servicios en la subred local. El resto del método crea un enlace personalizado e inserta el elemento de enlace de detección en la parte superior de la pila.
![]() |
---|
DiscoveryClientBindingElement se debe colocar en la parte superior de la pila de enlaces. El objeto BindingElement sobre DiscoveryClientBindingElement debe asegurarse de que el generador de canales o el canal que crea no use las propiedades Via o EndpointAddress, porque la dirección real solo se encuentra en el canal del cliente de detección. |
Después, se puede crear una instancia de CalculatorClient
pasando este enlace personalizado así como una dirección del extremo.
CalculatorServiceClient client = new CalculatorServiceClient(CreateCustomBindingWithDiscoveryElement(), DiscoveryClientBindingElement.DiscoveryEndpointAddress);
Al utilizar el canal de cliente de detección, se pasa la dirección del extremo constante especificada previamente. Ahora en el tiempo de ejecución, el canal de cliente de detección encuentra el servicio especificado por los criterios de búsqueda y se conecta a él. Para que el servicio y el cliente establezcan una conexión, deben tener también la misma pila de enlaces subyacente.
Para utilizar este ejemplo
Abra la solución en Visual Studio 2010.
Compile la solución.
Ejecute la aplicación de servicio y cada una de las aplicaciones cliente.
Observe que el cliente pudo encontrar el servicio sin conocer su dirección.