方法 : 構成でクライアント バインディングを指定する

この例では、電卓サービスを使用するためのクライアント コンソール アプリケーションを作成し、そのクライアントのバインディングを構成で宣言によって指定します。クライアントは CalculatorService にアクセスします。これにより、ICalculator インターフェイスが実装され、サービスとクライアントの両方で BasicHttpBinding クラスが使用されます。

ここで説明する手順は、電卓サービスが実行されていることを前提とします。サービスをビルドする方法については、「方法 : 構成でサービス バインディングを指定する」を参照してください。クライアント コンポーネントを自動的に生成するために、Windows Communication Foundation (WCF) に付属する ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) も使用します。このツールにより、サービスにアクセスするためのクライアント コードと構成が生成されます。

クライアントは 2 つの部分で構成されます。Svcutil.exe によって、ICalculator インターフェイスを実装する ClientCalculator が生成されます。次に、ClientCalculator のインスタンスを作成することで、クライアント アプリケーションを作成します。

通常、ベスト プラクティスは、コードで命令として記述するよりも、構成でバインディングを指定して情報を明示的にアドレス指定することです。展開済みサービスのバインディングおよびアドレスは一般的に、サービスの開発中に使用されるものとは異なるので、コード内でエンドポイントを定義することは通常、実用的ではありません。一般に、バインディング情報とアドレス情報をコードに含めないようにすると、変更時にアプリケーションの再コンパイルや再展開を行う必要がなくなります。

次のすべての構成手順は、構成エディター ツール (SvcConfigEditor.exe) を使用して実行できます。

この例のソースのコピーについては、「BasicBinding」のサンプルを参照してください。

構成を使用したクライアント バインディングの指定

  1. コマンド ラインから Svcutil.exe を実行して、サービス メタデータからコードを生成します。

    Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> 
    
  2. 生成されたクライアントには、クライアントの実装時に満たされなければならないサービス コントラクトを定義する ICalculator インターフェイスが含まれます。

    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="Microsoft.ServiceModel.Samples.ICalculator")]
    public interface ICalculator
    {
    
        [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")]
        double Add(double n1, double n2);
    
        [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")]
        double Subtract(double n1, double n2);
    
        [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")]
        double Multiply(double n1, double n2);
    
        [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")]
        double Divide(double n1, double n2);
    }
    
  3. 生成されたクライアントは ClientCalculator も実装します。

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public partial class CalculatorClient : System.ServiceModel.ClientBase<Microsoft.ServiceModel.Samples.ICalculator>, Microsoft.ServiceModel.Samples.ICalculator
    {
    
        public CalculatorClient()
        {
        }
    
        public CalculatorClient(string endpointConfigurationName) : 
                base(endpointConfigurationName)
        {
        }
    
        public CalculatorClient(string endpointConfigurationName, string remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
    
        public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(endpointConfigurationName, remoteAddress)
        {
        }
    
        public CalculatorClient(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);
        }
    }
    
  4. BasicHttpBinding クラスを使用するクライアントの構成も、Svcutil.exe により生成されます。Visual Studio を使用する場合、このファイルに App.config という名前を付けます。このサービスの実装では、アドレス情報とバインディング情報が指定されないことに注意してください。同様に、コードは構成ファイルから情報を取得する必要はありません。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
    
        <client>
          <endpoint 
              name=""
              address="https://localhost/servicemodelsamples/service.svc" 
              binding="basicHttpBinding" 
              contract="Microsoft.ServiceModel.Samples.ICalculator" />
        </client>
    
        <bindings>
          <basicHttpBinding/>
        </bindings>
    
      </system.serviceModel>
    
    </configuration>
    
  5. アプリケーションで ClientCalculator のインスタンスを作成し、サービス操作を呼び出します。

    using System;
    using System.ServiceModel;
    
    namespace Microsoft.ServiceModel.Samples
    {
    
        //Client implementation code.
        class Client
        {
            static void Main()
            {
                // Create a client with given client endpoint configuration
                CalculatorClient client = new CalculatorClient();
    
                // Call the Add service operation.
                double value1 = 100.00D;
                double value2 = 15.99D;
                double result = client.Add(value1, value2);
                Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
                // Call the Subtract service operation.
                value1 = 145.00D;
                value2 = 76.54D;
                result = client.Subtract(value1, value2);
                Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
                // Call the Multiply service operation.
                value1 = 9.00D;
                value2 = 81.25D;
                result = client.Multiply(value1, value2);
                Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
                // Call the Divide service operation.
                value1 = 22.00D;
                value2 = 7.00D;
                result = client.Divide(value1, value2);
                Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    
                //Closing the client gracefully closes the connection and cleans up resources
                client.Close();
    
                Console.WriteLine();
                Console.WriteLine("Press <ENTER> to terminate client.");
                Console.ReadLine();
            }
        }
    }
    
    
  6. クライアントをコンパイルして実行します。

参照

概念

サービスとクライアントを構成するためのバインディングの使用