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

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

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

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

    EndpointAddress mexAddress = new EndpointAddress("https://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();
    
    ms733780.note(ja-jp,VS.100).gif注 :
    メタデータのインポートが完了すると、クライアント チャネルの作成もメタデータのエクスポートもできなくなります。これは、この時点で型情報を使用できないためです。型情報は、サービスと実際に対話する場合またはメタデータをエクスポートする場合に必要です。型情報を生成するには、コードを生成する必要があります。これについては、手順 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();
    

参照

処理手順

入門サンプル

概念

メタデータ