メタデータの抽出

RetrieveMetadata のサンプルでは、サービスからメタデータを動的に取得し、通信に使用するエンドポイントを選択するクライアントを実装する方法を示します。 このサンプルは、「入門サンプル」に基づいています。 このサービスは 2 つのエンドポイントを公開するように変更されています。1 つは basicHttpBinding バインディングを使用してベース アドレスで公開するエンドポイント、もう 1 つは wsHttpBinding バインディングを使用して {baseaddress}/secure で公開するセキュリティ保護されたエンドポイントです。 これらのエンドポイント アドレスとバインディングを使用してクライアントを構成する代わりに、クライアントでは MetadataExchangeClient クラスを使用してサービスのメタデータを動的に取得し、ServiceEndpointCollection クラスを使用してこのメタデータを WsdlImporter としてインポートします。

Note

このサンプルのセットアップ手順とビルド手順については、このトピックの最後を参照してください。

クライアント アプリケーションはインポートされた ServiceEndpointCollection を使用して、サービスとの通信に使用するクライアントを作成します。 クライアント アプリケーションは、取得した各エンドポイントを反復処理し、ICalculator コントラクトを実装した各エンドポイントと通信を行います。 適切なアドレスとバインディングは取得したエンドポイントで提供されます。これによって、クライアントは各エンドポイントと通信するように構成されます。次のサンプル コードを参照してください。

// Create a MetadataExchangeClient for retrieving metadata.
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);

// Retrieve the metadata for all endpoints using metadata exchange protocol (mex).
MetadataSet metadataSet = mexClient.GetMetadata();

//Convert the metadata into endpoints.
WsdlImporter importer = new WsdlImporter(metadataSet);
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();

CalculatorClient client = null;
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
// Communicate with each endpoint that supports the ICalculator contract.
foreach (ServiceEndpoint ep in endpoints)
{
    if (ep.Contract.Namespace.Equals(contract.Namespace) && ep.Contract.Name.Equals(contract.Name))
    {
        // Create a client using the endpoint address and binding.
        client = new CalculatorClient(ep.Binding, new EndpointAddress(ep.Address.Uri));
        Console.WriteLine("Communicate with endpoint: ");
        Console.WriteLine("   AddressPath={0}", ep.Address.Uri.PathAndQuery);
        Console.WriteLine("   Binding={0}", ep.Binding.Name);
        // Call operations.
        DoCalculations(client);

        //Closing the client gracefully closes the connection and cleans up resources.
        client.Close();
    }
}

クライアント コンソール ウィンドウには、各エンドポイントに送信された操作が、そのエンドポイントのアドレス パスとバインディング名と共に表示されます。

サンプルをセットアップ、ビルド、および実行するには

  1. Windows Communication Foundation サンプルの 1 回限りのセットアップの手順を実行したことを確認します。

  2. ソリューションの C#、C++、Visual Basic .NET 版をビルドするには、「Windows Communication Foundation サンプルのビルド」の手順に従います。

  3. 単一または複数コンピューター構成でサンプルを実行するには、「Windows Communication Foundation サンプルの実行」の手順に従います。