方法: メタデータをサービス エンドポイントにインポートする

このトピックでは、メタデータをサービス エンドポイントのコレクションにインポートし、入門のページに定義されているサービスを使用する方法を説明します。 また、サービスからメタデータをインポートし、次にそのサービスに対して Add メソッドを呼び出すクライアント アプリケーションを作成する方法についても説明します。

メタデータをサービス エンドポイントにインポートするには

  1. EndpointAddress オブジェクトを定義し、サービスの metadata exchange (MEX) アドレスの URI (Uniform Resource Identifier) を使ってそのオブジェクトを初期化します。

    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
    
  2. MetadataExchangeClient を作成し、MEX アドレスを渡して GetMetadata を呼び出します。 これにより、メタデータをサービスから取得します。

    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaSet = mexClient.GetMetadata();
    
  3. WsdlImporter を作成し、前に取得したメタデータを渡して ImportAllContracts を呼び出します。 これにより、ContractDescription オブジェクトのコレクションを生成します。 必要に応じて、ImportAllEndpoints または ImportAllBindings を呼び出すこともできます。

    WsdlImporter importer = new WsdlImporter(metaSet);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
    

    Note

    メタデータのインポートが完了すると、クライアント チャネルの作成もメタデータのエクスポートもできなくなります。 これは、この時点で型情報を使用できないためです。 型情報は、サービスと実際に対話する場合またはメタデータをエクスポートする場合に必要です。 型情報を生成するには、コードを生成する必要があります。これについては、手順 4. ~ 5. で説明します。 別の方法として、MetadataResolver ヘルパー クラスを使用することもできます。 詳細については、「方法: MetadataResolver を使用してバインディング メタデータを動的に取得する」を参照してください。

  4. 各コントラクトに型情報を生成します。

    ServiceContractGenerator generator = new ServiceContractGenerator();
    foreach (ContractDescription contract in contracts)
    {
        generator.GenerateServiceContractType(contract);
    }
    
    if (generator.Errors.Count != 0)
        throw new Exception("There were errors during code compilation.");
    
  5. これで、この情報を使用できます。 次の例では、C# ソース コードが生成されます。

    System.CodeDom.Compiler.CodeGeneratorOptions options = new System.CodeDom.Compiler.CodeGeneratorOptions();
    options.BracingStyle = "C";
    System.CodeDom.Compiler.CodeDomProvider codeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("C#");
    System.CodeDom.Compiler.IndentedTextWriter textWriter = new System.CodeDom.Compiler.IndentedTextWriter(new System.IO.StreamWriter(outputFile));
    codeDomProvider.GenerateCodeFromCompileUnit(generator.TargetCompileUnit, textWriter, options);
    textWriter.Close();
    

関連項目