WCF クライアントを使用したサービスへのアクセス

サービスを作成したら、次に、WCF クライアントを作成します。クライアント アプリケーションは、WCF クライアントを使用してサービスと通信します。通常、クライアント アプリケーションはサービスのメタデータをインポートし、サービスを呼び出すことのできる WCF クライアント コードを生成します。

WCF クライアントを作成するための基本手順は、次のとおりです。

  1. サービス コードをコンパイルします。
  2. ServiceModel Metadata Utility Tool (SvcUtil.exe) を使用して、WCF クライアントを作成します。

ServiceModel メタデータ ユーティリティ ツール

ServiceModel Metadata Utility Tool (Svcutil.exe) ツールは、メタデータからコードを生成するコマンド ライン ツールです。基本的な Svcutil.exe コマンドの使用例を次に示します。

Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> 

また、Svcutil.exe は、ファイル システム上の Web サービス記述言語 (WSDL) ファイルや XML スキーマ定義言語 (XSD) ファイルを指定して使用することもできます。

Svcutil.exe <list of WSDL and XSD files on file system>

結果として、WCF クライアント コードが格納されたコード ファイルが作成されます。クライアント アプリケーションはこのコードを使用してサービスを呼び出すことができます。

このツールを使用して構成ファイルを生成することもできます。

Svcutil.exe <file1 [,file2]>

ファイル名を 1 つだけ指定した場合、それは出力ファイルの名前になります。ファイル名を 2 つ指定した場合は、1 番目のファイルが入力構成ファイルになり、そのファイルの内容と生成された構成がマージされ、2 番目のファイルに書き出されます。構成詳細については、 、「Windows Communication Foundation サービスのバインディングの構成」を参照してください。

ms734691.Important(ja-jp,VS.90).gif メモ :
セキュリティで保護されていないメタデータ要求には、セキュリティで保護されていないネットワーク要求と同様の一定の危険が伴います。通信先のエンドポイントが、本当に相手から通知されたとおりのエンドポイントかどうかわからない場合、取得した情報は悪質なサービスからのメタデータである可能性があります。

サービス用に作成されたコントラクトのコード例を次に示します。

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}
' Define a service contract.
<ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
    <OperationContract()>  _
    Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double 
    ' Other methods are not shown here.
End Interface 

ServiceModel メタデータ ユーティリティ ツールは、次の WCF クライアント クラスを生成します。このクラスは ClientBase ジェネリック クラスから継承されたもので、ICalculator インターフェイスを実装します。このツールは、ICalculator インターフェイス (この例には表示されていません) も生成します。

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
    public CalculatorClient(){}
    
    public CalculatorClient(string configurationName) : 
            base(configurationName)
    {}
    
    public CalculatorClient(System.ServiceModel.Binding binding) : 
            base(binding)
    {}
    
    public CalculatorClient(System.ServiceModel.EndpointAddress address,
    System.ServiceModel.Binding binding) : 
            base(address, binding)
    {}
    
    public double Add(double n1, double n2)
    {
        return base.InnerChannel.Add(n1, n2);
    }
}
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator
    
    Public Sub New()
        MyBase.New
    End Sub
    
    Public Sub New(ByVal configurationName As String)
        MyBase.New(configurationName)
    End Sub
    
    Public Sub New(ByVal binding As System.ServiceModel.Binding)
        MyBase.New(binding)
    End Sub
    
    Public Sub New(ByVal address As _
    System.ServiceModel.EndpointAddress, _
    ByVal binding As System.ServiceModel.Binding)
        MyBase.New(address, binding)
    End Sub
    
    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As _
    Double Implements ICalculator.Add
        Return MyBase.InnerChannel.Add(n1, n2)
    End Function 
End Class

WCF クライアントの使用

WCF クライアントを使用するには、次のコードのように WCF クライアントのインスタンスを作成し、次にそのメソッドを呼び出します。

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint"));
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")

' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

クライアントによってスローされた例外のデバッグ

WCF クライアントからスローされる例外の多くは、サービスで発生した例外が原因となって引き起こされます。いくつかの例を次に示します。

  • SocketException: 既存の接続がリモート ホストによって強制終了されました。
  • CommunicationException: 基になる接続が予期せずに閉じられました。
  • CommunicationObjectAbortedException: ソケット接続が中止されました。これは、メッセージ処理時のエラー、リモート ホストでの受信タイムアウトの超過、または基になるネットワーク リソースの問題が原因で発生する可能性があります。

このような種類の例外が発生した場合、問題を解決する最適な方法は、サービス側でトレースをオンにし、そこで発生した例外を特定することです。トレース詳細については、 、「トレース」および「トレースを使用したアプリケーションのトラブルシューティング」を参照してください。

関連項目

タスク

方法 : Windows Communication Foundation クライアントを作成する
方法 : 双方向コントラクトを使用してサービスにアクセスする
方法 : WCF サービス操作を非同期に呼び出す
方法 : 一方向コントラクトと要求/応答コントラクトを使用して WCF サービスにアクセスする
方法 : WCF クライアントで WSE 3.0 サービスにアクセスする
方法 : XmlSerializer を使用する WCF クライアント アプリケーションの起動時間を短縮する

概念

生成されたクライアント コードの理解
クライアントのランタイム動作の指定
クライアントの動作の構成