次の方法で共有


WCF クライアントの概要

このセクションでは、クライアント アプリケーションの動作、Windows Communication Foundation (WCF) クライアントを構成、作成、使用する方法、およびクライアント アプリケーションをセキュリティで保護する方法について説明します。

WCF クライアント オブジェクトの使用

クライアント アプリケーションは、WCF クライアントを使用して別のアプリケーションと通信するマネージド アプリケーションです。 WCF サービスのクライアント アプリケーションを作成するには、次の手順が必要です。

  1. サービス エンドポイントのサービス コントラクト、バインディング、およびアドレス情報を取得します。

  2. その情報を使用して WCF クライアントを作成します。

  3. 呼び出し操作。

  4. WCF クライアント オブジェクトを閉じます。

以下のセクションでは、これらの手順について説明し、次の問題について簡単に説明します。

  • エラーの処理

  • クライアントの構成とセキュリティ保護。

  • 双方向サービスのコールバック オブジェクトの作成。

  • サービスを非同期的に呼び出す。

  • クライアント チャネルを使用したサービスの呼び出し。

サービス コントラクト、バインディング、およびアドレスを取得する

WCF では、サービスとクライアントは、マネージド属性、インターフェイス、メソッドを使用してコントラクトをモデル化します。 クライアント アプリケーションでサービスに接続するには、サービス コントラクトの型情報を取得する必要があります。 通常は、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用して、サービス コントラクトの型情報を取得します。 ユーティリティは、サービスからメタデータをダウンロードし、任意の言語でマネージド ソース コード ファイルに変換し、WCF クライアント オブジェクトの構成に使用できるクライアント アプリケーション構成ファイルを作成します。 たとえば、 MyCalculatorServiceを呼び出す WCF クライアント オブジェクトを作成し、そのサービスのメタデータが http://computerName/MyCalculatorService/Service.svc?wsdlで公開されていることがわかっている場合、次のコード例では、Svcutil.exe を使用して、マネージド コード内のサービス コントラクトを含む ClientCode.vb ファイルを取得する方法を示します。

svcutil /language:vb /out:ClientCode.vb /config:app.config http://computerName/MyCalculatorService/Service.svc?wsdl  

このコントラクト コードは、クライアント アプリケーションまたはクライアント アプリケーションが WCF クライアント オブジェクトの作成に使用できる別のアセンブリにコンパイルできます。 構成ファイルを使用して、サービスに適切に接続するようにクライアント オブジェクトを構成できます。

このプロセスの例については、「 方法: クライアントを作成する」を参照してください。 コントラクトの詳細については、「 コントラクト」を参照してください。

WCF クライアント オブジェクトを作成する

WCF クライアントは、クライアントがリモート サービスとの通信に使用できる形式で WCF サービスを表すローカル オブジェクトです。 WCF クライアントの種類はターゲット サービス コントラクトを実装するため、作成して構成すると、クライアント オブジェクトを直接使用してサービス操作を呼び出すことができます。 WCF ランタイムは、メソッド呼び出しをメッセージに変換し、それらをサービスに送信し、応答をリッスンし、それらの値を戻り値または out または ref パラメーターとして WCF クライアント オブジェクトに返します。

WCF クライアント チャネル オブジェクトを使用して、サービスに接続して使用することもできます。 詳細については、「 WCF クライアント アーキテクチャ」を参照してください。

新しい WCF オブジェクトの作成

ClientBase<TChannel> クラスの使用を示すために、サービス アプリケーションから次の単純なサービス コントラクトが生成されていると仮定します。

Visual Studio を使用して WCF クライアントを作成する場合、プロジェクトにサービス参照を追加すると、オブジェクトがオブジェクト ブラウザーに自動的に読み込まれます。

[System.ServiceModel.ServiceContractAttribute(
  Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
    [System.ServiceModel.OperationContractAttribute(
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
      ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
    )]
    [System.ServiceModel.FaultContractAttribute(
      typeof(microsoft.wcf.documentation.SampleFault),
      Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
    )]
    string SampleMethod(string msg);
}

Visual Studio を使用していない場合は、生成されたコントラクト コードを調べて、 ClientBase<TChannel> およびサービス コントラクト インターフェイス ISampleServiceを拡張する型を見つけます。 この場合、その型は次のコードのようになります。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{

    public SampleServiceClient()
    {
    }

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

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

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

    public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
        :
            base(binding, remoteAddress)
    {
    }
    public string SampleMethod(string msg)
    {
        return base.Channel.SampleMethod(msg);
    }
}

このクラスは、コンストラクターのいずれかを使用してローカル オブジェクトとして作成し、構成してから、 ISampleService型のサービスに接続するために使用できます。

まず WCF クライアント オブジェクトを作成してから、それを使用して、1 つの try/catch ブロック内で閉じておくことをお勧めします。 特定の障害モードで例外をマスクできるため、 using ステートメント (Visual Basic ではUsing ) は使用しないでください。 詳細については、次のセクションを参照してください。また、 閉じると中止を使用して WCF クライアント リソースを解放します

コントラクト、バインディング、およびアドレス

WCF クライアント オブジェクトを作成する前に、クライアント オブジェクトを構成する必要があります。 具体的には、使用するサービス エンドポイント が必要です。 エンドポイントは、サービス コントラクト、バインディング、およびアドレスの組み合わせです。 (エンドポイントの詳細については、「 エンドポイント: アドレス、バインディング、コントラクト」を参照してください)。通常、この情報はクライアント アプリケーション構成ファイルの <endpoint> 要素 (Svcutil.exe ツールによって生成されたものなど) にあり、クライアント オブジェクトの作成時に自動的に読み込まれます。 どちらの WCF クライアントの種類にも、プログラムでこの情報を指定できるオーバーロードがあります。

たとえば、前の例で使用した ISampleService の生成された構成ファイルには、次のエンドポイント情報が含まれています。

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_ISampleService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/SampleService" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_ISampleService" contract="ISampleService"
                name="WSHttpBinding_ISampleService">
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

この構成ファイルは、 <client> 要素内のターゲット エンドポイントを指定します。 複数のターゲット エンドポイントの使用の詳細については、 ClientBase<TChannel> または ChannelFactory<TChannel> コンストラクターを参照してください。

呼び出し元の操作

クライアント オブジェクトを作成して構成したら、try/catch ブロックを作成し、オブジェクトがローカルの場合と同じ方法で操作を呼び出し、WCF クライアント オブジェクトを閉じます。 クライアント アプリケーションが最初の操作を呼び出すと、WCF によって基になるチャネルが自動的に開かれ、オブジェクトがリサイクルされると、基になるチャネルが閉じられます。 (または、他の操作を呼び出す前またはその後にチャネルを明示的に開いたり閉じたりすることもできます)。

たとえば、次のサービス コントラクトがある場合です。

namespace Microsoft.ServiceModel.Samples  
{  
    using System;  
    using System.ServiceModel;  
  
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]  
    public interface ICalculator  
   {  
        [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);  
    }  
}  
Namespace Microsoft.ServiceModel.Samples  
  
    Imports System  
    Imports System.ServiceModel  
  
    <ServiceContract(Namespace:= _  
    "http://Microsoft.ServiceModel.Samples")> _
   Public Interface ICalculator  
        <OperationContract> _
        Function Add(n1 As Double, n2 As Double) As Double  
        <OperationContract> _
        Function Subtract(n1 As Double, n2 As Double) As Double  
        <OperationContract> _
        Function Multiply(n1 As Double, n2 As Double) As Double  
        <OperationContract> _
     Function Divide(n1 As Double, n2 As Double) As Double  
End Interface  

次のコード例に示すように、WCF クライアント オブジェクトを作成してそのメソッドを呼び出すことで、操作を呼び出すことができます。 WCF クライアント オブジェクトの開始、呼び出し、終了は、1 つの try/catch ブロック内で発生します。 詳細については、「 WCF クライアントを使用してサービスにアクセスする 」および「 Close and Abort を使用して WCF クライアント リソースを解放する」を参照してください。

CalculatorClient wcfClient = new CalculatorClient();
try
{
    Console.WriteLine(wcfClient.Add(4, 6));
    wcfClient.Close();
}
catch (TimeoutException timeout)
{
    // Handle the timeout exception.
    wcfClient.Abort();
}
catch (CommunicationException commException)
{
    // Handle the communication exception.
    wcfClient.Abort();
}

エラーの処理

クライアント アプリケーションでは、基になるクライアント チャネルを開くときに (操作を呼び出すことによって明示的に、または自動的に)、クライアント オブジェクトまたはチャネル オブジェクトを使用して操作を呼び出すとき、または基になるクライアント チャネルを閉じるときに例外が発生する可能性があります。 少なくとも、アプリケーションは、操作によって返された SOAP エラーの結果としてスローされるSystem.ServiceModel.FaultException オブジェクトに加えて、可能なSystem.TimeoutExceptionおよびSystem.ServiceModel.CommunicationException例外を処理することを想定することをお勧めします。 操作コントラクトで指定された SOAP エラーは、型パラメーターが SOAP エラーの詳細型である System.ServiceModel.FaultException<TDetail> としてクライアント アプリケーションに発生します。 クライアント アプリケーションでのエラー状態の処理の詳細については、「エラーの 送信と受信」を参照してください。 クライアントでエラーを処理する方法を示す完全なサンプルについては、「 予期される例外」を参照してください。

クライアントの構成とセキュリティ保護

クライアントの構成は、クライアントまたはチャネル オブジェクトに必要なターゲット エンドポイント情報 (通常は構成ファイルから) の読み込みから始まりますが、クライアントコンストラクターとプロパティを使用してプログラムでこの情報を読み込むこともできます。 ただし、特定のクライアント動作と多くのセキュリティ シナリオを有効にするには、追加の構成手順が必要です。

たとえば、サービス コントラクトのセキュリティ要件はサービス コントラクト インターフェイスで宣言され、構成ファイル Svcutil.exe 作成された場合、そのファイルには通常、サービスのセキュリティ要件をサポートできるバインディングが含まれます。 ただし、場合によっては、クライアント資格情報の構成など、より多くのセキュリティ構成が必要になる場合があります。 WCF クライアントのセキュリティ構成の詳細については、「クライアントの セキュリティ保護」を参照してください。

さらに、カスタム実行時の動作など、一部のカスタム変更をクライアント アプリケーションで有効にすることができます。 カスタム クライアントの動作を構成する方法の詳細については、「クライアント動作の 構成」を参照してください。

双方向サービスのコールバック オブジェクトの作成

双方向サービスは、コントラクトの要件に従ってサービスが呼び出すコールバック オブジェクトを提供するために、クライアント アプリケーションが実装する必要があるコールバック コントラクトを指定します。 コールバック オブジェクトは完全なサービスではありませんが (たとえば、コールバック オブジェクトを使用してチャネルを開始することはできません)、実装と構成の目的で、それらはサービスの一種と考えることができます。

双方向サービスのクライアントは、次の条件を満たす必要があります。

  • コールバック コントラクト クラスを実装します。

  • コールバック コントラクト実装クラスのインスタンスを作成し、それを使用して、WCF クライアント コンストラクターに渡す System.ServiceModel.InstanceContext オブジェクトを作成します。

  • 操作を呼び出し、操作コールバックを処理します。

双方向 WCF クライアント オブジェクトは、非duplex に対応するオブジェクトと同様に機能します。ただし、コールバック サービスの構成など、コールバックをサポートするために必要な機能が公開されている点が異なります。

たとえば、コールバック クラスの System.ServiceModel.CallbackBehaviorAttribute 属性のプロパティを使用して、コールバック オブジェクトのランタイム動作のさまざまな側面を制御できます。 もう 1 つの例として、 System.ServiceModel.Description.CallbackDebugBehavior クラスを使用して、コールバック オブジェクトを呼び出すサービスに例外情報を返せるようにします。 詳細については、「 双方向サービス」を参照してください。 完全なサンプルについては、「 二重」を参照してください。

インターネット インフォメーション サービス (IIS) 5.1 を実行している Windows XP コンピューターでは、双方向クライアントは、 System.ServiceModel.WSDualHttpBinding クラスを使用してクライアントのベース アドレスを指定する必要があります。または、例外がスローされます。 次のコード例は、コードでこれを行う方法を示しています。

WSDualHttpBinding dualBinding = new WSDualHttpBinding();
EndpointAddress endptadr = new EndpointAddress("http://localhost:12000/DuplexTestUsingCode/Server");
dualBinding.ClientBaseAddress = new Uri("http://localhost:8000/DuplexTestUsingCode/Client/");

Dim dualBinding As New WSDualHttpBinding()
Dim endptadr As New EndpointAddress("http://localhost:12000/DuplexTestUsingCode/Server")
dualBinding.ClientBaseAddress = New Uri("http://localhost:8000/DuplexTestUsingCode/Client/")

次のコードは、構成ファイルでこれを行う方法を示しています

<client>
  <endpoint
    name ="ServerEndpoint"
    address="http://localhost:12000/DuplexUsingConfig/Server"
    bindingConfiguration="WSDualHttpBinding_IDuplex"
    binding="wsDualHttpBinding"
    contract="IDuplex"
/>
</client>
<bindings>
  <wsDualHttpBinding>
    <binding
      name="WSDualHttpBinding_IDuplex"
      clientBaseAddress="http://localhost:8000/myClient/"
    />
  </wsDualHttpBinding>
</bindings>

サービスの非同期呼び出し

操作の呼び出し方法は、完全にクライアント開発者が行います。 これは、マネージド コードで表現すると、操作を構成するメッセージを同期メソッドまたは非同期メソッドにマップできるためです。 したがって、操作を非同期的に呼び出すクライアントを構築する場合は、Svcutil.exe を使用して、 /async オプションを使用して非同期クライアント コードを生成できます。 詳細については、「 方法: サービス操作を非同期的に呼び出す」を参照してください。

WCF クライアント チャネルを使用したサービスの呼び出し

WCF クライアントの種類は、 ClientBase<TChannel>を拡張し、それ自体 System.ServiceModel.IClientChannel インターフェイスから派生して、基になるチャネル システムを公開します。 System.ServiceModel.ChannelFactory<TChannel> クラスでターゲット サービス コントラクトを使用してサービスを呼び出すことができます。 詳細については、「 WCF クライアント アーキテクチャ」を参照してください。

こちらも参照ください