Beispiel für ErmittlungsbindungselementDiscovery Binding Element Sample

In diesem Beispiel wird gezeigt, wie das Ermittlungsclient-Bindungselement verwendet wird, um einen Dienst zu ermitteln.This sample demonstrates how to use the discovery client binding element to discover a service. Diese Funktion ermöglicht es Entwicklern, ihrem vorhandenen Clientkanalstapel einen Ermittlungsclientkanal hinzuzufügen. Dadurch wird das Programmiermodell sehr intuitiv.This feature enables developers to add a discovery client channel to their existing client channel stack, making the programming model very intuitive. Wenn der zugeordnete Kanal geöffnet wird, wird die Adresse des Diensts mit der Ermittlung aufgelöst.When the associated channel is opened, the address of the service is resolved using discovery. Dieses Beispiel besteht aus den folgenden Projekten:This sample consists of the following projects:

  • CalculatorService: einen sichtbaren WCF-Dienst.CalculatorService: A discoverable WCF service.

  • CalculatorClient: ein WCF-Clientanwendung, die den Discovery Clientchannel zu suchen, und rufen Sie den CalculatorService verwendet.CalculatorClient: A WCF client application that uses the discovery client channel to search for and call the CalculatorService.

  • DynamicCalculatorClient: eine WCF-Clientanwendung, die mit einem dynamischen Endpunkt gesucht und den CalculatorService aufrufen.DynamicCalculatorClient: A WCF client application that uses a dynamic endpoint to search for and call the CalculatorService.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.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. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

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

CalculatorServiceCalculatorService

Dieses Projekt enthält einen einfachen Rechnerdienst, der den ICalculatorService-Vertrag implementiert.This project contains a simple calculator service that implements the ICalculatorService contract.

Die folgende APP.CONFIG-Datei wird verwendet, um ein <serviceDiscovery>-Verhalten zum Dienstverhalten und zum Ermittlungsendpunkt hinzuzufügen.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>  

Dadurch werden der Dienst und seine Endpunkte ermittelbar.This makes the service and its endpoints discoverable. Der CalculatorService ist ein selbst gehosteter Dienst, der mit der NetTcpBinding-Bindung einen Endpunkt hinzufügt.The CalculatorService is a self-hosted service that adds one endpoint using the NetTcpBinding binding. Zudem wird dem Endpunkt ein EndpointDiscoveryBehavior hinzugefügt und ein Bereich angegeben, wie im folgenden Code gezeigt.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

Dieses Projekt enthält eine Clientimplementierung, mit der Meldungen an den CalculatorService gesendet werden.This project contains a client implementation that sends messages to the CalculatorService. Das Programm erstellt mithilfe der CreateCustomBindingWithDiscoveryElement()-Methode eine benutzerdefinierte Bindung, die den Ermittlungsclientkanal verwendet.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; }  

Nachdem das DiscoveryClientBindingElement instanziiert wurde, gibt der Entwickler die Kriterien an, die bei der Suche nach einem Dienst verwendet werden sollen.After the DiscoveryClientBindingElement is instantiated, the developer specifies the criteria to use when searching for a service. In diesem Fall ist das Ermittlungssuchkriterium der ICalculatorService-Typ.In this case, the discovery find criterion is the ICalculatorService type. Darüber hinaus gibt der Entwickler einen DiscoveryEndpointProvider an, der einen DiscoveryEndpoint zurückgibt, mit dem angegeben wird, wo nach den Diensten gesucht werden soll.Additionally, the developer specifies a DiscoveryEndpointProvider which returns a DiscoveryEndpoint that specifies where to look for the services. Der DiscoveryEndpointProvider gibt eine neue DiscoveryEndpoint-Instanz zurück.The DiscoveryEndpointProvider returns a new DiscoveryEndpoint instance. Weitere Informationen finden Sie unter verwenden eine benutzerdefinierte Bindung, mit der Discovery-Clientchannel.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 diesem Fall verwendet der Client den UDP-Multicastmechanismus, der im Discovery-Protokoll definiert wird, um nach Diensten im lokalen Subnetz zu suchen.In this case, the client uses the UDP multicast mechanism defined by the Discovery protocol to search for services on the local subnet. Mit dem Rest der Methode wird eine benutzerdefinierte Bindung erstellt und das Discovery-Bindungselement zu Beginn des Stapels eingefügt.The remainder of the method creates a custom binding and inserts the Discovery binding element at the top of the stack.

Hinweis

Das DiscoveryClientBindingElement muss zu Beginn des Bindungsstapels eingefügt werden.The DiscoveryClientBindingElement must be placed on the top of the binding stack. Für jedes BindingElement vor dem DiscoveryClientBindingElement muss sichergestellt werden, dass die erstellte Kanalfactory oder der erstellte Kanal nicht die EndpointAddress-Eigenschaft oder die Via-Eigenschaft verwendet, da die tatsächliche Adresse nur im Discovery-Clientkanal gefunden werden kann.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.

Als Nächstes kann der CalculatorClient instanziiert werden, indem diese benutzerdefinierte Bindung sowie eine Endpunktadresse übergeben werden.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);  

Wenn Sie den Ermittlungsclientkanal verwenden, wird die zuvor angegebene konstante Endpunktadresse übergeben.When using the Discovery Client Channel, the constant endpoint address specified previously is passed in. Zur Laufzeit findet der Ermittlungsclientkanal den angegebenen Dienst mithilfe der Suchkriterien und stellt eine Verbindung mit ihm her.Now at runtime, the Discovery Client Channel finds the service specified by the find criteria and connects to it. Damit der Dienst und der Client eine Verbindung herstellen können, müssen sie außerdem über denselben zugrunde liegenden Bindungsstapel verfügen.For the service and the client to establish a connection, they must also have the same underlying binding stack.

So verwenden Sie dieses BeispielTo use this sample

  1. Öffnen Sie die Projektmappe in Visual Studio 2012Visual Studio 2012.Open the solution in Visual Studio 2012Visual Studio 2012.

  2. Erstellen Sie die Projektmappe.Build the solution.

  3. Führen Sie die Dienstanwendung und alle Clientanwendungen aus.Run the service application and each of the client applications.

  4. Beachten Sie, dass der Client den Dienst ermitteln konnte, ohne seine Adresse zu kennen.Observe that the client was able to find the service without knowing its address.

Siehe auchSee Also