Esempio di elemento di associazione di individuazioneDiscovery Binding Element Sample

In questo esempio viene illustrato come utilizzare l'elemento di associazione del client di individuazione per individuare un servizio.This sample demonstrates how to use the discovery client binding element to discover a service. Questa funzionalità consente agli sviluppatori di aggiungere un canale client di individuazione allo stack dei canali del client esistente, rendendo il modello di programmazione estremamente intuitivo.This feature enables developers to add a discovery client channel to their existing client channel stack, making the programming model very intuitive. Quando il canale associato viene aperto, l'indirizzo del servizio viene risolto utilizzando la funzionalità di individuazione.When the associated channel is opened, the address of the service is resolved using discovery. L'esempio è costituito dai progetti seguenti:This sample consists of the following projects:

  • CalculatorService: un servizio WCF individuabile.CalculatorService: A discoverable WCF service.

  • CalculatorClient: applicazione client WCF che utilizza il canale client di individuazione per cercare e chiamare CalculatorService.CalculatorClient: A WCF client application that uses the discovery client channel to search for and call the CalculatorService.

  • DynamicCalculatorClient: applicazione client WCF che utilizza un endpoint dinamico per cercare e chiamare CalculatorService.DynamicCalculatorClient: A WCF client application that uses a dynamic endpoint to search for and call the CalculatorService.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Discovery\DiscoveryBindingElement

CalculatorServiceCalculatorService

Questo progetto contiene un servizio calcolatrice semplice che implementa il contratto ICalculatorService.This project contains a simple calculator service that implements the ICalculatorService contract.

Il file App.config seguente viene utilizzato per aggiungere un comportamento <serviceDiscovery> nei comportamenti del servizio, nonché l'endpoint di individuazione.The following App.config file is used to add a <serviceDiscovery> behavior in the service behaviors as well as the discovery endpoint.

<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>  

Il servizio e gli endpoint corrispondenti vengono in tal modo resi individuabili.This makes the service and its endpoints discoverable. CalculatorService è un servizio indipendente che aggiunge un endpoint utilizzando l'associazione NetTcpBinding.The CalculatorService is a self-hosted service that adds one endpoint using the NetTcpBinding binding. Aggiunge inoltre EndpointDiscoveryBehavior all'endpoint e specifica un ambito, come illustrato nel codice seguente.It also adds an EndpointDiscoveryBehavior to the endpoint and specifies a scope as shown in the following code.

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

CalculatorClientCalculatorClient

Questo progetto contiene un'implementazione client che invia messaggi a CalculatorService.This project contains a client implementation that sends messages to the CalculatorService. Questo programma utilizza il metodo CreateCustomBindingWithDiscoveryElement() per creare un'associazione personalizzata che utilizza il canale client di individuazione.This program uses the CreateCustomBindingWithDiscoveryElement() method to create a custom binding that uses the Discovery Client Channel.

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

Dopo aver creato un'istanza di DiscoveryClientBindingElement, lo sviluppatore specifica i criteri da utilizzare durante la ricerca di un servizio.After the DiscoveryClientBindingElement is instantiated, the developer specifies the criteria to use when searching for a service. In questo caso, il criterio di ricerca dell'individuazione è il tipo ICalculatorService.In this case, the discovery find criterion is the ICalculatorService type. Lo sviluppatore specifica inoltre un oggetto DiscoveryEndpointProvider che restituisce un oggetto DiscoveryEndpoint che specifica la posizione in cui eseguire la ricerca dei servizi.Additionally, the developer specifies a DiscoveryEndpointProvider which returns a DiscoveryEndpoint that specifies where to look for the services. DiscoveryEndpointProvider restituisce una nuova istanza di DiscoveryEndpoint.The DiscoveryEndpointProvider returns a new DiscoveryEndpoint instance. Per altre informazioni, vedere utilizzando un'associazione personalizzata con il canale Client di individuazione.For more information, see Using a Custom Binding with the Discovery Client Channel.

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

In questo caso, il client utilizza il meccanismo UDP multicast definito dal protocollo di individuazione per la ricerca dei servizi nella subnet locale.In this case, the client uses the UDP multicast mechanism defined by the Discovery protocol to search for services on the local subnet. La restante parte del metodo crea un'associazione personalizzata e inserisce l'elemento di associazione dell'individuazione in cima allo stack.The remainder of the method creates a custom binding and inserts the Discovery binding element at the top of the stack.

Nota

È necessario posizionare DiscoveryClientBindingElement in cima allo stack dell'associazione.The DiscoveryClientBindingElement must be placed on the top of the binding stack. È necessario che qualsiasi BindingElement posto in cima a DiscoveryClientBindingElement verifichi che la channel factory o il canale creato non utilizzi la proprietà EndpointAddress o Via, poiché l'indirizzo effettivo viene trovato solo in corrispondenza del canale client di individuazione.Any BindingElement on top of DiscoveryClientBindingElement must make sure that the channel factory or channel it creates does not use the EndpointAddress or Via properties, because the actual address is found only at the Discovery client channel.

È quindi possibile creare un'istanza di CalculatorClient attraverso il passaggio di questa associazione personalizzata e di un indirizzo dell'endpoint.Next, the CalculatorClient can be instantiated by passing in this custom binding as well as an endpoint address.

CalculatorServiceClient client = new CalculatorServiceClient(CreateCustomBindingWithDiscoveryElement(), DiscoveryClientBindingElement.DiscoveryEndpointAddress);  

Quando si utilizza il canale client di individuazione, viene passato l'indirizzo dell'endpoint costante specificato in precedenza.When using the Discovery Client Channel, the constant endpoint address specified previously is passed in. Quindi, in fase di esecuzione, il canale client di individuazione trova il servizio specificato dai criteri di ricerca e vi si connette.Now at runtime, the Discovery Client Channel finds the service specified by the find criteria and connects to it. Affinché il servizio e il client stabiliscano una connessione, è inoltre necessario che dispongano dello stesso stack dell'associazione sottostante.For the service and the client to establish a connection, they must also have the same underlying binding stack.

Per usare questo esempioTo use this sample

  1. Aprire la soluzione in Visual Studio 2012Visual Studio 2012.Open the solution in Visual Studio 2012Visual Studio 2012.

  2. Compilare la soluzione.Build the solution.

  3. Eseguire l'applicazione di servizio e ognuna delle applicazioni client.Run the service application and each of the client applications.

  4. Si osservi che il client è stato in grado di trovare il servizio senza conoscerne l'indirizzo.Observe that the client was able to find the service without knowing its address.

Vedere ancheSee Also