Vorgehensweise: Programmgesteuertes Hinzufügen der Ermittelbarkeit zu einem WCF-Dienst und -ClientHow to: Programmatically Add Discoverability to a WCF Service and Client

In diesem Thema wird erläutert, wie Sie erreichen, dass ein Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Dienst erkennbar ist und danach gesucht werden kann.This topic explains how to make a Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) service discoverable. Es basiert auf der Selbsthosting Beispiel.It is based on the Self-Host sample.

So konfigurieren Sie das vorhandene Beispiel unter "Selbst gehostete Dienste" für die SucheTo configure the existing Self-Host service sample for Discovery

  1. Öffnen Sie in Visual Studio 2012Visual Studio 2012 die entsprechende Projektmappe (Self-Host).Open the Self-Host solution in Visual Studio 2012Visual Studio 2012. Das Beispiel befindet sich im Verzeichnis "TechnologySamples\Basic\Service\Hosting\SelfHost".The sample is located in the TechnologySamples\Basic\Service\Hosting\SelfHost directory.

  2. Fügen Sie dem Dienstprojekt einen Verweis auf System.ServiceModel.Discovery.dll hinzu.Add a reference to System.ServiceModel.Discovery.dll to the service project. Sie sehen eine Fehlermeldung angezeigt "System.You may see an error message saying "System. ServiceModel.Discovery.dll oder eine seiner Abhängigkeiten erfordert eine höhere Version von der .NET Framework.NET Framework als die im Projekt... "ServiceModel.Discovery.dll or one of its dependencies requires a later version of the .NET Framework.NET Framework than the one specified in the project …" Wenn Sie diese Meldung angezeigt wird, mit der rechten Maustaste des Projekts im Projektmappen-Explorer, und wählen Sie Eigenschaften.If you see this message, right-click the project in the Solution Explorer and choose Properties. In der Projekteigenschaften Fenster, stellen Sie sicher, dass die Zielframework ist .NET Framework 4.6.1.NET Framework 4.6.1.In the Project Properties window, make sure that the Target Framework is .NET Framework 4.6.1.NET Framework 4.6.1.

  3. Öffnen Sie die Datei "Service.cs", und fügen Sie die folgende using-Anweisung hinzu.Open the Service.cs file and add the following using statement.

    using System.ServiceModel.Discovery;  
    
  4. Fügen Sie in der Main()-Methode innerhalb der using-Anweisung dem Diensthost eine ServiceDiscoveryBehavior-Instanz hinzu.In the Main() method, inside the using statement, add a ServiceDiscoveryBehavior instance to the service host.

    public static void Main()  
    {  
        // Create a ServiceHost for the CalculatorService type.  
        using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))  
        {  
            // Add a ServiceDiscoveryBehavior  
            serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());                  
    
            // ...  
        }  
    }  
    

    Das ServiceDiscoveryBehavior-Objekt gibt an, dass der Dienst, auf den dieses Verhalten angewendet wird, erkennbar ist.The ServiceDiscoveryBehavior specifies that the service it is applied to is discoverable.

  5. Fügen Sie dem Diensthost direkt nach dem Code, in dem UdpDiscoveryEndpoint hinzugefügt wird, ein ServiceDiscoveryBehavior-Objekt hinzu.Add a UdpDiscoveryEndpoint to the service host right after the code that adds the ServiceDiscoveryBehavior.

    // Add ServiceDiscoveryBehavior  
    serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());  
    
    // Add a UdpDiscoveryEndpoint  
    serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());  
    

    Dieser Code gibt an, dass Suchmeldungen an den standardmäßigen UDP-Suchendpunkt gesendet werden sollen.This code specifies that discovery messages should be sent to the standard UDP discovery endpoint.

So erstellen Sie eine Clientanwendung, die die Suche zum Aufrufen des Diensts verwendetTo create a client application that uses discovery to call the service

  1. Fügen Sie der Projektmappe eine neue Konsolenanwendung mit dem Namen DiscoveryClientApp hinzu.Add a new console application to the solution called DiscoveryClientApp.

  2. Fügen Sie einen Verweis auf System.ServiceModel.dll und System.ServiceModel.Discovery.dll hinzu.Add a reference to System.ServiceModel.dll and System.ServiceModel.Discovery.dll

  3. Kopieren Sie die Dateien "GeneratedClient.cs" und "App.config" aus dem vorhandenen Clientprojekt in das neue DiscoveryClientApp-Projekt.Copy the GeneratedClient.cs and App.config files from the existing client project to the new DiscoveryClientApp project. Maustaste Sie dazu die Dateien in der Projektmappen-ExplorerOption Kopie, und wählen Sie dann die DiscoveryClientApp -Projekts mit der rechten Maustaste, und wählen Sie Einfügen.To do this, right-click the files in the Solution Explorer, select Copy, and then select the DiscoveryClientApp project, right-click and select Paste.

  4. Öffnen Sie die Datei Program.cs.Open Program.cs.

  5. Fügen Sie die folgenden using-Anweisungen hinzu.Add the following using statements.

    using System.ServiceModel;  
    using System.ServiceModel.Discovery;  
    using Microsoft.ServiceModel.Samples;  
    
  6. Fügen Sie der FindCalculatorServiceAddress()-Klasse eine statische Methode mit dem Namen Program hinzu.Add a static method called FindCalculatorServiceAddress() to the Program class.

    static EndpointAddress FindCalculatorServiceAddress()  
    {  
    }  
    

    Diese Methode verwendet die Suche (Discovery) zum Suchen nach dem CalculatorService-Dienst.This method uses discovery to search for the CalculatorService service.

  7. Erstellen Sie in der FindCalculatorServiceAddress-Methode eine neue DiscoveryClient-Instanz, die einen UdpDiscoveryEndpoint an den Konstruktor übergibt.Inside the FindCalculatorServiceAddress method, create a new DiscoveryClient instance, passing in a UdpDiscoveryEndpoint to the constructor.

    static EndpointAddress FindCalculatorServiceAddress()  
    {  
        // Create DiscoveryClient  
        DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());  
    }  
    

    Auf diese Weise wird WCFWCF mitgeteilt, dass die DiscoveryClient-Klasse den standardmäßigen UDP-Suchendpunkt zum Senden und Empfangen von Suchmeldungen verwenden soll.This tells WCFWCF that the DiscoveryClient class should use the standard UDP discovery endpoint to send and receive discovery messages.

  8. Rufen Sie in der nächsten Zeile die Find-Methode auf, und geben Sie eine FindCriteria-Instanz an, die den zu suchenden Dienstvertrag enthält.On the next line, call the Find method and specify a FindCriteria instance that contains the service contract you want to search for. Geben Sie in diesem Fall ICalculator an.In this case, specify ICalculator.

    // Find ICalculatorService endpoints              
    FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));  
    
  9. Überprüfen Sie nach dem Aufruf von Find, ob mindestens ein übereinstimmender Dienst vorhanden ist, und geben Sie für den ersten übereinstimmenden Dienst EndpointAddress zurück.After the call to Find, check to see if there is at least one matching service and return the EndpointAddress of the first matching service. Geben Sie andernfalls null zurück.Otherwise return null.

    if (findResponse.Endpoints.Count > 0)  
    {  
        return findResponse.Endpoints[0].Address;  
    }  
    else  
    {  
        return null;  
    }  
    
  10. Fügen Sie der InvokeCalculatorService-Klasse eine statische Methode mit dem Namen Program hinzu.Add a static method named InvokeCalculatorService to the Program class.

    static void InvokeCalculatorService(EndpointAddress endpointAddress)  
    {  
    }  
    

    Diese Methode verwendet die von FindCalculatorServiceAddress zurückgegebene Endpunktadresse zum Aufrufen des Rechnerdiensts.This method uses the endpoint address returned from FindCalculatorServiceAddress to call the calculator service.

  11. Erstellen Sie innerhalb der InvokeCalculatorService-Methode eine Instanz der CalculatorServiceClient-Klasse.Inside the InvokeCalculatorService method, create an instance of the CalculatorServiceClient class. Diese Klasse wird definiert, indem Sie die Selbsthosting Beispiel.This class is defined by the Self-Host sample. Sie wurde mithilfe von "Svcutil.exe" generiert.It was generated using Svcutil.exe.

    // Create a client  
    CalculatorClient client = new CalculatorClient();  
    
  12. Legen Sie in der nächsten Zeile die Endpunktadresse des Clients auf die Endpunktadresse fest, die von FindCalculatorServiceAddress() zurückgegeben wurde.On the next line, set the endpoint address of the client to the endpoint address returned from FindCalculatorServiceAddress().

    // Connect to the discovered service endpoint  
    client.Endpoint.Address = endpointAddress;  
    
  13. Rufen Sie direkt nach dem Code für den vorherigen Schritt die vom Rechnerdienst verfügbar gemachten Methoden auf.Immediately after the code for the previous step, call the methods exposed by the calculator service.

    Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);  
    
    double value1 = 100.00D;  
    double value2 = 15.99D;  
    
    // Call the Add service operation.  
    double result = client.Add(value1, value2);  
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  
    
    // Call the Subtract service operation.  
    result = client.Subtract(value1, value2);  
    Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);  
    
    // Call the Multiply service operation.  
    result = client.Multiply(value1, value2);  
    Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);  
    
    // Call the Divide service operation.  
    result = client.Divide(value1, value2);  
    Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);  
    Console.WriteLine();  
    
    //Closing the client gracefully closes the connection and cleans up resources  
    client.Close();  
    
  14. Fügen Sie der Main()-Methode in der Program-Klasse Code zum Aufrufen von FindCalculatorServiceAddress hinzu.Add code to the Main() method in the Program class to call FindCalculatorServiceAddress.

    public static void Main()  
    {  
        EndpointAddress endpointAddress = FindCalculatorServiceAddress();  
    }  
    
  15. Rufen Sie in der nächsten Zeile InvokeCalculatorService() auf, und übergeben Sie die Endpunktadresse, die von FindCalculatorServiceAddress() zurückgegeben wurde.On the next line, call the InvokeCalculatorService() and pass in the endpoint address returned from FindCalculatorServiceAddress().

    if (endpointAddress != null)  
    {  
        InvokeCalculatorService(endpointAddress);  
    }  
    
    Console.WriteLine("Press <ENTER> to exit.");  
    Console.ReadLine();  
    

So testen Sie die AnwendungTo test the application

  1. Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechte, und führen Sie "Service.exe" aus.Open an elevated command prompt and run Service.exe.

  2. Öffnen Sie eine Eingabeaufforderung, und führen Sie "Discoveryclientapp.exe" aus.Open a command prompt and run Discoveryclientapp.exe.

  3. Die Ausgabe der Datei "service.exe" sollte der folgenden Ausgabe ähneln.The output from service.exe should look like the following output.

    Received Add(100,15.99)  
    Return: 115.99  
    Received Subtract(100,15.99)  
    Return: 84.01  
    Received Multiply(100,15.99)  
    Return: 1599  
    Received Divide(100,15.99)  
    Return: 6.25390869293308  
    
  4. Die Ausgabe der Datei "Discoveryclientapp.exe" sollte der folgenden Ausgabe ähneln.The output from Discoveryclientapp.exe should look like the following output.

    Invoking CalculatorService at http://localhost:8000/ServiceModelSamples/service  
    Add(100,15.99) = 115.99  
    Subtract(100,15.99) = 84.01  
    Multiply(100,15.99) = 1599  
    Divide(100,15.99) = 6.25390869293308  
    
    Press <ENTER> to exit.  
    

BeispielExample

Es folgt eine Auflistung des Codes für dieses Beispiel.The following is a listing of the code for this sample. Dieser Code basiert auf der Selbsthosting Beispiel nur die Dateien, die geändert werden, werden aufgeführt.Because this code is based on the Self-Host sample, only those files that are changed are listed. Weitere Informationen finden Sie unterFor more information aboutDas Beispiel Selbsthosting finden Sie unter Setupanweisungen. the Self-Host sample, see Setup Instructions.

// Service.cs  
using System;  
using System.Configuration;  
using System.ServiceModel;  
using System.ServiceModel.Discovery;  

namespace Microsoft.ServiceModel.Samples  
{  
    // See SelfHost sample for service contract and implementation  
    // ...  

        // Host the service within this EXE console application.  
        public static void Main()  
        {  
            // Create a ServiceHost for the CalculatorService type.  
            using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))  
            {  
                // Add the ServiceDiscoveryBehavior to make the service discoverable  
                serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());  
                serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());  

                // Open the ServiceHost to create listeners and start listening for messages.  
                serviceHost.Open();  

                // The service can now be accessed.  
                Console.WriteLine("The service is ready.");  
                Console.WriteLine("Press <ENTER> to terminate service.");  
                Console.WriteLine();  
                Console.ReadLine();  
            }  
        }  
    }  
}  
// Program.cs  
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.ServiceModel;  
using System.ServiceModel.Discovery;  
using Microsoft.ServiceModel.Samples;  
using System.Text;  

namespace DiscoveryClientApp  
{  
    class Program  
    {  
        static EndpointAddress FindCalculatorServiceAddress()  
        {  
            // Create DiscoveryClient  
            DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());  

            // Find ICalculatorService endpoints              
            FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));  

            if (findResponse.Endpoints.Count > 0)  
            {  
                return findResponse.Endpoints[0].Address;  
            }  
            else  
            {  
                return null;  
            }  
        }  

        static void InvokeCalculatorService(EndpointAddress endpointAddress)  
        {  
            // Create a client  
            CalculatorClient client = new CalculatorClient();  

            // Connect to the discovered service endpoint  
            client.Endpoint.Address = endpointAddress;  

            Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);  

            double value1 = 100.00D;  
            double value2 = 15.99D;  

            // Call the Add service operation.  
            double result = client.Add(value1, value2);  
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);  

            // Call the Subtract service operation.  
            result = client.Subtract(value1, value2);  
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);  

            // Call the Multiply service operation.  
            result = client.Multiply(value1, value2);  
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);  

            // Call the Divide service operation.  
            result = client.Divide(value1, value2);  
            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);  
            Console.WriteLine();  

            //Closing the client gracefully closes the connection and cleans up resources  
            client.Close();  
        }  
        static void Main(string[] args)  
        {  
            EndpointAddress endpointAddress = FindCalculatorServiceAddress();  

            if (endpointAddress != null)  
            {  
                InvokeCalculatorService(endpointAddress);  
            }  

            Console.WriteLine("Press <ENTER> to exit.");  
            Console.ReadLine();  

        }  
    }  
}  

Siehe auchSee Also

Übersicht über die WCF-SucheWCF Discovery Overview
Objektmodell der WCF-SucheWCF Discovery Object Model