WCF クライアントを使用したサービスへのアクセス
サービスを作成したら、次に、WCF クライアントを作成します。クライアント アプリケーションは、WCF クライアントを使用してサービスと通信します。通常、クライアント アプリケーションはサービスのメタデータをインポートし、サービスを呼び出すことのできる WCF クライアント コードを生成します。
WCF クライアントを作成するための基本手順は、次のとおりです。
サービス コードをコンパイルします。
ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) を使用して、WCF クライアントを作成します。
ServiceModel メタデータ ユーティリティ ツール
ServiceModel メタデータ ユーティリティ ツール (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 サービスのバインディングの構成」を参照してください。
注 : |
---|
セキュリティで保護されていないメタデータ要求には、セキュリティで保護されていないネットワーク要求と同様の一定の危険が伴います。通信先のエンドポイントが、本当に相手から通知されたとおりのエンドポイントかどうかわからない場合、取得した情報は悪質なサービスからのメタデータである可能性があります。 |
例
サービス用に作成されたコントラクトのコード例を次に示します。
// 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 クライアント アプリケーションの起動時間を短縮する