Freigeben über


Vorgehensweise: Implementieren eines ermittelbaren Diensts, der beim Suchproxy registriert ist

Dieses Thema ist das zweite von vier Themen, in denen erläutert wird, wie sie einen Suchproxy implementieren. Im vorherigen Thema, Vorgehensweise: Implementieren eines Suchproxys, haben Sie einen Suchproxy implementiert. In diesem Thema erstellen Sie einen WCF-Dienst, der Ankündigungsnachrichten (Hello und Bye) an den Suchproxy sendet. Dies bewirkt, dass der Dienst sich beim Suchproxy registriert bzw. dass die Registrierung aufgehoben wird.

So definieren Sie den Dienstvertrag

  1. Fügen Sie der Projektmappe DiscoveryProxyExample ein neues Konsolenanwendungsprojekt mit dem Namen Service hinzu.

  2. Fügen Sie den folgenden Assemblys Verweise hinzu:

    1. System.ServiceModel

    2. System.ServiceModel.Discovery

  3. Fügen Sie dem CalculatorService-Projekt eine neue Klasse hinzu.

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

    using System;
    using System.ServiceModel;
    
  5. Definieren Sie den Dienstvertrag innerhalb der Datei CalculatorService.cs.

    // Define a service contract.
        [ServiceContract(Namespace = "http://Microsoft.Samples.Discovery")]
        public interface ICalculatorService
        {
            [OperationContract]
            double Add(double n1, double n2);
            [OperationContract]
            double Subtract(double n1, double n2);
            [OperationContract]
            double Multiply(double n1, double n2);
            [OperationContract]
            double Divide(double n1, double n2);
        }
    
  6. Implementieren Sie in der Datei CalculatorService.cs auch den Dienstvertrag.

    // Service class which implements the service contract.    
        public class CalculatorService : ICalculatorService
        {
            public double Add(double n1, double n2)
            {
                double result = n1 + n2;
                Console.WriteLine("Received Add({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Subtract(double n1, double n2)
            {
                double result = n1 - n2;
                Console.WriteLine("Received Subtract({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Multiply(double n1, double n2)
            {
                double result = n1 * n2;
                Console.WriteLine("Received Multiply({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Divide(double n1, double n2)
            {
                double result = n1 / n2;
                Console.WriteLine("Received Divide({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
        }
    

So hosten Sie den Dienst

  1. Öffnen Sie die Datei Program.cs, die generiert wurde, als Sie das Projekt erstellt haben.

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

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Discovery;
    
  3. Fügen Sie in der Main()-Methode den folgenden Code hinzu:

    // Define the base address of the service
    Uri baseAddress = new Uri("net.tcp://localhost:9002/CalculatorService/" + Guid.NewGuid().ToString());
    // Define the endpoint address where announcement messages will be sent
    Uri announcementEndpointAddress = new Uri("net.tcp://localhost:9021/Announcement");
    
    // Create the service host
    ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);
    try
    {
       // Add a service endpoint
       ServiceEndpoint netTcpEndpoint = serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new NetTcpBinding(), string.Empty);              
    
       // Create an announcement endpoint, which points to the Announcement Endpoint hosted by the proxy service.
       AnnouncementEndpoint announcementEndpoint = new AnnouncementEndpoint(new NetTcpBinding(), new EndpointAddress(announcementEndpointAddress));
    
       // Create a ServiceDiscoveryBehavior and add the announcement endpoint
       ServiceDiscoveryBehavior serviceDiscoveryBehavior = new ServiceDiscoveryBehavior();
                    serviceDiscoveryBehavior.AnnouncementEndpoints.Add(announcementEndpoint);
    
       // Add the ServiceDiscoveryBehavior to the service host to make the service discoverable
       serviceHost.Description.Behaviors.Add(serviceDiscoveryBehavior);
    
       // Start listening for messages
      serviceHost.Open();
    
       Console.WriteLine("Calculator Service started at {0}", baseAddress);
       Console.WriteLine();
       Console.WriteLine("Press <ENTER> to terminate the service.");
       Console.WriteLine();
       Console.ReadLine();
    
       serviceHost.Close();
    }
    catch (CommunicationException e)
    {
       Console.WriteLine(e.Message);
    }
    catch (TimeoutException e)
    {
       Console.WriteLine(e.Message);
    }   
    
    if (serviceHost.State != CommunicationState.Closed)
    {
       Console.WriteLine("Aborting the service...");
       serviceHost.Abort();
    }
    

Sie haben die Implementierung eines erkennbaren Diensts abgeschlossen. Fahren Sie mit Vorgehensweise: Implementieren einer Clientanwendung, die den Suchproxy zum Suchen nach einem Dienst verwendet fort.

Beispiel

Dies ist die vollständige Codeauflistung für dieses Thema.

    // CalculatorService.cs
    //----------------------------------------------------------------
    // Copyright (c) Microsoft Corporation.  All rights reserved.
    //----------------------------------------------------------------
    
    using System;
    using System.ServiceModel;
    
    namespace Microsoft.Samples.Discovery
    {
        // Define a service contract.
        [ServiceContract(Namespace = "http://Microsoft.Samples.Discovery")]
        public interface ICalculatorService
        {
            [OperationContract]
            double Add(double n1, double n2);
            [OperationContract]
            double Subtract(double n1, double n2);
            [OperationContract]
            double Multiply(double n1, double n2);
            [OperationContract]
            double Divide(double n1, double n2);
        }
    
        // Service class which implements the service contract.    
        public class CalculatorService : ICalculatorService
        {
            public double Add(double n1, double n2)
            {
                double result = n1 + n2;
                Console.WriteLine("Received Add({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Subtract(double n1, double n2)
            {
                double result = n1 - n2;
                Console.WriteLine("Received Subtract({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Multiply(double n1, double n2)
            {
                double result = n1 * n2;
                Console.WriteLine("Received Multiply({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
    
            public double Divide(double n1, double n2)
            {
                double result = n1 / n2;
                Console.WriteLine("Received Divide({0},{1})", n1, n2);
                Console.WriteLine("Return: {0}", result);
                return result;
            }
        }
    }
    // Program.cs
    //----------------------------------------------------------------
    // Copyright (c) Microsoft Corporation.  All rights reserved.
    //----------------------------------------------------------------
    
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Discovery;
    
    namespace Microsoft.Samples.Discovery
    {
        class Program
        {
            public static void Main()
            {
                Uri baseAddress = new Uri("net.tcp://localhost:9002/CalculatorService/" + Guid.NewGuid().ToString());
                Uri announcementEndpointAddress = new Uri("net.tcp://localhost:9021/Announcement");
    
                ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);
                try
                {
                    ServiceEndpoint netTcpEndpoint = serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new NetTcpBinding(), string.Empty);              
    
                    // Create an announcement endpoint, which points to the Announcement Endpoint hosted by the proxy service.
                    AnnouncementEndpoint announcementEndpoint = new AnnouncementEndpoint(new NetTcpBinding(), new EndpointAddress(announcementEndpointAddress));
                    ServiceDiscoveryBehavior serviceDiscoveryBehavior = new ServiceDiscoveryBehavior();
                    serviceDiscoveryBehavior.AnnouncementEndpoints.Add(announcementEndpoint);
    
                    // Make the service discoverable
                    serviceHost.Description.Behaviors.Add(serviceDiscoveryBehavior);
    
                    serviceHost.Open();
    
                    Console.WriteLine("Calculator Service started at {0}", baseAddress);
                    Console.WriteLine();
                    Console.WriteLine("Press <ENTER> to terminate the service.");
                    Console.WriteLine();
                    Console.ReadLine();
    
                    serviceHost.Close();
                }
                catch (CommunicationException e)
                {
                    Console.WriteLine(e.Message);
                }
                catch (TimeoutException e)
                {
                    Console.WriteLine(e.Message);
                }   
                
                if (serviceHost.State != CommunicationState.Closed)
                {
                    Console.WriteLine("Aborting the service...");
                    serviceHost.Abort();
                }
            }
        }
    }

Siehe auch

Aufgaben

Vorgehensweise: Implementieren eines Suchproxys
Vorgehensweise: Implementieren einer Clientanwendung, die den Suchproxy zum Suchen nach einem Dienst verwendet

Weitere Ressourcen

WCF-Suche