次の方法で共有


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

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

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

  1. サービス コードをコンパイルします。

  2. WCF クライアント プロキシを生成します。

  3. WCF クライアント プロキシをインスタンス化します。

WCF クライアント プロキシは、Service Model Metadata Utility Tool (SvcUtil.exe) を使用して手動で生成できます。詳細については、「 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)」を参照してください。 WCF クライアント プロキシは、 サービス参照の追加 機能を使用して Visual Studio 内で生成することもできます。 いずれかの方法を使用して WCF クライアント プロキシを生成するには、サービスが実行されている必要があります。 サービスがセルフホステッドの場合は、ホストを実行する必要があります。 サービスが IIS/WAS でホストされている場合は、他の操作を行う必要はありません。

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

ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) は、メタデータからコードを生成するためのコマンド ライン ツールです。 基本的な Svcutil.exe コマンドの例を次に示します。

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

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

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

結果は、クライアント アプリケーションがサービスの呼び出しに使用できる WCF クライアント コードを含むコード ファイルです。

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

Svcutil.exe <file1 [,file2]>

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

Von Bedeutung

セキュリティで保護されていないメタデータ要求は、セキュリティで保護されていないネットワーク要求が行うのと同じ方法で特定のリスクを引き起こします。通信相手のエンドポイントが誰であるかが不明な場合、取得する情報は悪意のあるサービスからのメタデータである可能性があります。

Visual Studio でのサービス参照の追加

サービスが実行されている状態で、WCF クライアント プロキシを含むプロジェクトを右クリックし、[ 追加>Service 参照] を選択します。 [ サービス参照の追加] ダイアログで、呼び出すサービスの URL を入力し、[ 移動 ] ボタンをクリックします。 ダイアログには、指定したアドレスで使用可能なサービスの一覧が表示されます。 サービスをダブルクリックして、使用可能なコントラクトと操作を確認し、生成されたコードの名前空間を指定して、[ OK] ボタンをクリックします。

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

// 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

Visual Studio の ServiceModel メタデータ ユーティリティ ツールと サービス参照の追加 により、次の WCF クライアント クラスが生成されます。 クラスはジェネリック ClientBase<TChannel> クラスから継承し、 ICalculator インターフェイスを実装します。 このツールでは、 ICalculator インターフェイスも生成されます (ここでは示されていません)。

public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, 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);
    }
}
Partial Public Class CalculatorClient
    Inherits System.ServiceModel.ClientBase(Of ICalculator)
    Implements ICalculator

    Public Sub New()
        MyBase.New
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String)
        MyBase.New(endpointConfigurationName)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal endpointConfigurationName As String,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(endpointConfigurationName, remoteAddress)
    End Sub

    Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding,
        ByVal remoteAddress As System.ServiceModel.EndpointAddress)
        MyBase.New(binding, remoteAddress)
    End Sub

    Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
        Implements ICalculator.Add
        Return MyBase.Channel.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: ソケット接続が中止されました。 これは、メッセージの処理中にエラーが発生した、リモート ホストによって受信タイムアウトが超過した、または基になるネットワーク リソースの問題が原因である可能性があります。

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

こちらも参照ください