Compartir a través de


Cómo: Implementar un servicio reconocible que se registra con el proxy de detección

Este tema es el segundo de cuatro temas que describe cómo implementar un proxy de detección. En el tema anterior, Cómo: Implementar un proxy de detección, implementó un proxy de detección. En este tema, creará un servicio de WCF que enviará mensajes de anuncio (Hello y Bye) al proxy de detección, haciendo que se registre y se elimine del registro con el proxy de detección.

Para definir el contrato de servicio

  1. Agregue un nuevo proyecto de aplicación de consola a la solución DiscoveryProxyExample denominada Service.

  2. Agregue referencias a los ensamblados siguientes:

    1. System.ServiceModel

    2. System.ServiceModel.Discovery

  3. Agregue una nueva clase al proyecto CalculatorService.

  4. Agregue las siguientes instrucciones de uso.

    using System;
    using System.ServiceModel;
    
  5. Dentro de CalculatorService.cs, defina el contrato de servicios.

    // 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. También dentro de CalculatorService.cs, implemente el contrato de servicios.

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

Para hospedar el servicio

  1. Abra el archivo Program.cs que se generó cuando creó el proyecto.

  2. Agregue las siguientes instrucciones de uso.

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Discovery;
    
  3. Agregue el código siguiente en el método Main():

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

Ha completado la implementación de un servicio que se puede detectar. Continúe en Cómo: Implementar una aplicación cliente que utiliza el proxy de detección para buscar un servicio.

Ejemplo

Esta es la lista completa del código empleado en este tema.

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

Vea también

Tareas

Cómo: Implementar un proxy de detección
Cómo: Implementar una aplicación cliente que utiliza el proxy de detección para buscar un servicio

Otros recursos

Detección de WCF