Vorgehensweise: Programmgesteuertes Hinzufügen der Ermittelbarkeit zu einem WCF-Dienst und -Client

In diesem Thema wird erläutert, wie Sie erreichen, dass ein Windows Communication Foundation (WCF)-Dienst erkennbar ist und danach gesucht werden kann. Es basiert auf der Self-Hosting Beispiel.

So konfigurieren Sie das vorhandene Beispiel unter "Selbst gehostete Dienste" für die Suche

  1. Öffnen Sie in Visual Studio 2012 die entsprechende Projektmappe (Self-Host). Das Beispiel befindet sich im Verzeichnis "TechnologySamples\Basic\Service\Hosting\SelfHost".

  2. Fügen Sie dem Dienstprojekt einen Verweis auf System.ServiceModel.Discovery.dll hinzu. Ggf. wird folgende Fehlermeldung angezeigt: "System. ServiceModel.Discovery.dll oder eine seiner Abhängigkeiten erfordert eine höhere Version von der .NET Framework als den im Projekt... " Wenn diese Meldung angezeigt wird, mit der rechten Maustaste des Projekts im Projektmappen-Explorer, und wählen Sie Eigenschaften. In der Projekteigenschaften Fenster, stellen Sie sicher, dass die Zielframework ist .NET Framework 4.6.1.

  3. Öffnen Sie die Datei "Service.cs", und fügen Sie die folgende using-Anweisung hinzu.

    using System.ServiceModel.Discovery;  
    
  4. In der Main() -Methode, die innerhalb der using -Anweisung, Hinzufügen einer ServiceDiscoveryBehavior Instanz für den Diensthost.

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

    Die ServiceDiscoveryBehavior gibt an, dass der Dienst wird für sichtbar ist.

  5. Hinzufügen einer UdpDiscoveryEndpoint dem Diensthost direkt nach der Code, der 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.

So erstellen Sie eine Clientanwendung, die die Suche zum Aufrufen des Diensts verwendet

  1. Fügen Sie der Projektmappe eine neue Konsolenanwendung mit dem Namen DiscoveryClientApp hinzu.

  2. Fügen Sie einen Verweis auf System.ServiceModel.dll und System.ServiceModel.Discovery.dll hinzu.

  3. Kopieren Sie die Dateien "GeneratedClient.cs" und "App.config" aus dem vorhandenen Clientprojekt in das neue DiscoveryClientApp-Projekt. Maustaste Sie dazu die Dateien in der Projektmappen-Explorerauf Kopie, und wählen Sie dann die DiscoveryClientApp -Projekts mit der rechten Maustaste, und wählen einfügen.

  4. Öffnen Sie die Datei Program.cs.

  5. Fügen Sie die folgenden using-Anweisungen hinzu.

    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.

    static EndpointAddress FindCalculatorServiceAddress()  
    {  
    }  
    

    Diese Methode verwendet die Suche (Discovery) zum Suchen nach dem CalculatorService-Dienst.

  7. In der FindCalculatorServiceAddress -Methode erstellen Sie ein neues DiscoveryClient -Instanz ein UdpDiscoveryEndpoint an den Konstruktor.

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

    Dies weist WCF , die DiscoveryClient -Klasse den standardmäßigen UDP-suchendpunkt zum Senden und Empfangen von Suchmeldungen verwenden soll.

  8. Rufen Sie in der nächsten Zeile, die Find Methode und geben Sie einen FindCriteria -Instanz, die den Dienstvertrag enthält Sie suchen möchten. Geben Sie in diesem Fall ICalculator an.

    // Find ICalculatorService endpoints              
    FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));  
    
  9. Nach dem Aufruf von Find, überprüfen, wenn mindestens ein übereinstimmender Dienst vorhanden ist und Zurückgeben der EndpointAddress der ersten übereinstimmenden Dienst. Geben Sie andernfalls null zurück.

    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.

    static void InvokeCalculatorService(EndpointAddress endpointAddress)  
    {  
    }  
    

    Diese Methode verwendet die von FindCalculatorServiceAddress zurückgegebene Endpunktadresse zum Aufrufen des Rechnerdiensts.

  11. Erstellen Sie innerhalb der InvokeCalculatorService-Methode eine Instanz der CalculatorServiceClient-Klasse. Diese Klasse wird definiert, indem die Self-Hosting Beispiel. Sie wurde mithilfe von "Svcutil.exe" generiert.

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

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

    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.

    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.

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

So testen Sie die Anwendung

  1. Öffnen Sie eine Eingabeaufforderung mit erhöhten Rechte, und führen Sie "Service.exe" aus.

  2. Öffnen Sie eine Eingabeaufforderung, und führen Sie "Discoveryclientapp.exe" aus.

  3. Die Ausgabe der Datei "service.exe" sollte der folgenden Ausgabe ähneln.

    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.

    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.  
    

Beispiel

Es folgt eine Auflistung des Codes für dieses Beispiel. Dieser Code basiert auf der Self-Hosting Beispiel nur die geänderten Dateien aufgeführt sind. Weitere Informationen finden Sie unterSelf-Hosting-Beispiel finden Sie unter Setupanweisungen.


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

Übersicht über die WCF-Ermittlung
Objektmodell für WCF-Suche