Condividi tramite


Procedura: implementare un servizio individuabile che esegue la registrazione al proxy di individuazione

Quello che segue è il secondo di quattro argomenti incentrato sull'implementazione di un proxy di individuazione. Nell'argomento precedente, Procedura: implementare un proxy di individuazione, è stato implementato un proxy di individuazione. In questo argomento viene creato un servizio WCF che invia messaggi di annuncio (Hello e Bye) al proxy dell'individuazione, determinandone la registrazione e il relativo annullamento dal proxy di individuazione.

Per definire il contratto di servizio

  1. Aggiungere un nuovo progetto applicazione console denominato Service alla soluzione DiscoveryProxyExample.

  2. Aggiungere riferimenti agli assembly seguenti:

    1. System.ServiceModel

    2. System.ServiceModel.Discovery

  3. Aggiungere al progetto una nuova classe denominata CalculatorService.

  4. Aggiungere le istruzioni using seguenti.

    using System;
    using System.ServiceModel;
    
  5. Definire il contratto di servizio all'interno di 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. Implementare inoltre il contratto di servizio all'interno di CalculatorService.cs.

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

Per ospitare il servizio

  1. Aprire il file Program.cs generato in fase di creazione del progetto.

  2. Aggiungere le istruzioni using seguenti.

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Discovery;
    
  3. Nel metodo Main() aggiungere il codice seguente:

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

L'implementazione di un servizio individuabile è quindi completata. Passare a Procedura: implementare un'applicazione client che utilizza il proxy di individuazione per cercare un servizio.

Esempio

Quello che segue è l'elenco completo del codice utilizzato in questo argomento.

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

Vedere anche

Attività

Procedura: implementare un proxy di individuazione
Procedura: implementare un'applicazione client che utilizza il proxy di individuazione per cercare un servizio

Altre risorse

WCF Discovery