次の方法で共有


探索プロキシで登録される探索可能なサービスの実装方法

これは、探索プロキシの実装方法に関する 4 つのトピックのうちの 2 番目のトピックです。前のトピックの「探索プロキシを実装する方法」では、探索プロキシを実装しました。このトピックでは、アナウンス メッセージ (Hello および Bye) を探索プロキシに送信する WCF サービスを作成します。この送信により、サービスが探索プロキシに登録または登録解除されます。

サービス コントラクトを定義するには

  1. 新しいコンソール アプリケーション プロジェクトを、Service という DiscoveryProxyExample ソリューションに追加します。

  2. 次のアセンブリへの参照を追加します。

    1. System.ServiceModel

    2. System.ServiceModel.Discovery

  3. 新しいクラスを CalculatorService プロジェクトに追加します。

  4. 次の using ステートメントを追加します。

    using System;
    using System.ServiceModel;
    
  5. 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. また、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;
            }
        }
    

サービスをホストするには

  1. プロジェクトの作成時に生成された Program.cs ファイルを開きます。

  2. 次の using ステートメントを追加します。

    using System;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Discovery;
    
  3. 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();
    }
    

これで、探索サービスの実装が完了しました。次に、「探索プロキシを使用してサービスを検索するクライアント アプリケーションの実装方法」に進みます。

このトピックで使用するコード全体の一覧を次に示します。

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

参照

処理手順

探索プロキシを実装する方法
探索プロキシを使用してサービスを検索するクライアント アプリケーションの実装方法

その他のリソース

WCF Discovery