次の方法で共有


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

このトピックは、探索プロキシの実装方法について説明する 3 つのトピックのうちの 3 番目です。 前のトピック「 方法 : 探索プロキシに登録する探索可能なサービスを実装する」では、探索プロキシに自身を登録する WCF サービスを実装しました。 このトピックでは、探索プロキシを使用して WCF サービスを検索する WCF クライアントを作成します。

クライアントの実装

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

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

    1. System.ServiceModel (英語)

    2. System.ServiceModel.Discovery

  3. このトピックの下部にあるGeneratedClient.csをプロジェクトに追加します。

    このファイルは通常、Svcutil.exeなどのツールを使用して生成されます。 このトピックでは、タスクを簡略化するために説明します。

  4. Program.csファイルを開き、次の方法を追加します。 このメソッドは、エンドポイント アドレスを取得し、それを使用してサービス クライアント (プロキシ) を初期化します。

    static void InvokeCalculatorService(EndpointAddress endpointAddress)
    {
        // Create a client
        CalculatorServiceClient client = new CalculatorServiceClient(new NetTcpBinding(), endpointAddress);
        Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress.Uri);
        Console.WriteLine();
    
        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();
    }
    
  5. Main メソッドに次のコードを追加します。

    public static void Main()
    {
        // Create a DiscoveryEndpoint that points to the DiscoveryProxy
        Uri probeEndpointAddress = new Uri("net.tcp://localhost:8001/Probe");
        DiscoveryEndpoint discoveryEndpoint = new DiscoveryEndpoint(new NetTcpBinding(), new EndpointAddress(probeEndpointAddress));
    
        // Create a DiscoveryClient passing in the discovery endpoint
        DiscoveryClient discoveryClient = new DiscoveryClient(discoveryEndpoint);
    
        Console.WriteLine("Finding ICalculatorService endpoints using the proxy at {0}", probeEndpointAddress);
        Console.WriteLine();
    
        try
        {
            // Search for services that implement ICalculatorService
            FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculatorService)));
    
            Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count);
            Console.WriteLine();
    
            // Check to see if endpoints were found, if so then invoke the service.
            if (findResponse.Endpoints.Count > 0)
            {
                InvokeCalculatorService(findResponse.Endpoints[0].Address);
            }
        }
        catch (TargetInvocationException)
        {
            Console.WriteLine("This client was unable to connect to and query the proxy. Ensure that the proxy is up and running.");
        }
    
        Console.WriteLine("Press <ENTER> to exit.");
        Console.ReadLine();
    }
    

これで、クライアント・アプリケーションの実装は完了です。 「方法 : 探索プロキシをテストする」に進みます。

これは、このトピックの完全なコードリストです。

// GeneratedClient.cs
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.1434
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Microsoft.Samples.Discovery
{
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.Samples.Discovery", ConfigurationName = "ICalculatorService")]
    public interface ICalculatorService
    {

        [System.ServiceModel.OperationContractAttribute(ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign, Action = "http://Microsoft.Samples.Discovery/ICalculatorService/Add", ReplyAction = "http://Microsoft.Samples.Discovery/ICalculatorService/AddResponse")]
        double Add(double n1, double n2);

        [System.ServiceModel.OperationContractAttribute(ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign, Action = "http://Microsoft.Samples.Discovery/ICalculatorService/Subtract", ReplyAction = "http://Microsoft.Samples.Discovery/ICalculatorService/SubtractResponse")]
        double Subtract(double n1, double n2);

        [System.ServiceModel.OperationContractAttribute(ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign, Action = "http://Microsoft.Samples.Discovery/ICalculatorService/Multiply", ReplyAction = "http://Microsoft.Samples.Discovery/ICalculatorService/MultiplyResponse")]
        double Multiply(double n1, double n2);

        [System.ServiceModel.OperationContractAttribute(ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign, Action = "http://Microsoft.Samples.Discovery/ICalculatorService/Divide", ReplyAction = "http://Microsoft.Samples.Discovery/ICalculatorService/DivideResponse")]
        double Divide(double n1, double n2);
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface ICalculatorServiceChannel : ICalculatorService, System.ServiceModel.IClientChannel
    {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class CalculatorServiceClient : System.ServiceModel.ClientBase<ICalculatorService>, ICalculatorService
    {

        public CalculatorServiceClient()
        {
        }

        public CalculatorServiceClient(string endpointConfigurationName) :
            base(endpointConfigurationName)
        {
        }

        public CalculatorServiceClient(string endpointConfigurationName, string remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
        {
        }

        public CalculatorServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
            base(endpointConfigurationName, remoteAddress)
        {
        }

        public CalculatorServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
            base(binding, remoteAddress)
        {
        }

        public double Add(double n1, double n2)
        {
            return base.Channel.Add(n1, n2);
        }

        public double Subtract(double n1, double n2)
        {
            return base.Channel.Subtract(n1, n2);
        }

        public double Multiply(double n1, double n2)
        {
            return base.Channel.Multiply(n1, n2);
        }

        public double Divide(double n1, double n2)
        {
            return base.Channel.Divide(n1, n2);
        }
    }
}
// Program.cs
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------

using System;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Discovery;

namespace Microsoft.Samples.Discovery
{
    class Client
    {
        public static void Main()
        {
            // Create a DiscoveryEndpoint that points to the DiscoveryProxy
            Uri probeEndpointAddress = new Uri("net.tcp://localhost:8001/Probe");
            DiscoveryEndpoint discoveryEndpoint = new DiscoveryEndpoint(new NetTcpBinding(), new EndpointAddress(probeEndpointAddress));

            DiscoveryClient discoveryClient = new DiscoveryClient(discoveryEndpoint);

            Console.WriteLine("Finding ICalculatorService endpoints using the proxy at {0}", probeEndpointAddress);
            Console.WriteLine();

            try
            {
                // Find ICalculatorService endpoints
                FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculatorService)));

                Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endpoints.Count);
                Console.WriteLine();

                // Check to see if endpoints were found, if so then invoke the service.
                if (findResponse.Endpoints.Count > 0)
                {
                    InvokeCalculatorService(findResponse.Endpoints[0].Address);
                }
            }
            catch (TargetInvocationException)
            {
                Console.WriteLine("This client was unable to connect to and query the proxy. Ensure that the proxy is up and running.");
            }

            Console.WriteLine("Press <ENTER> to exit.");
            Console.ReadLine();
        }

        static void InvokeCalculatorService(EndpointAddress endpointAddress)
        {
            // Create a client
            CalculatorServiceClient client = new CalculatorServiceClient(new NetTcpBinding(), endpointAddress);
            Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress.Uri);
            Console.WriteLine();

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

こちらも参照ください