方法 : メタデータをサービス エンドポイントにインポートする
このトピックでは、メタデータをサービス エンドポイントのコレクションにインポートし、「入門サンプル」に定義されているサービスを使用する方法について説明します。また、サービスからメタデータをインポートし、次にそのサービスに対して Add メソッドを呼び出すクライアント アプリケーションを作成する方法についても説明します。
メタデータをサービス エンドポイントにインポートするには
EndpointAddress オブジェクトを定義し、サービスの metadata exchange (MEX) アドレスの URI (Uniform Resource Identifier) を使ってそのオブジェクトを初期化します。
EndpointAddress mexAddress = new EndpointAddress("https://localhost:8000/ServiceModelSamples/service/mex");
MetadataExchangeClient を作成し、MEX アドレスを渡して GetMetadata を呼び出します。これにより、メタデータをサービスから取得します。
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaSet = mexClient.GetMetadata();
WsdlImporter を作成し、前に取得したメタデータを渡して ImportAllContracts を呼び出します。これにより、ContractDescription オブジェクトのコレクションを生成します。必要に応じて、ImportAllEndpoints または ImportAllBindings を呼び出すこともできます。
WsdlImporter importer = new WsdlImporter(metaSet); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
注 : メタデータのインポートが完了すると、クライアント チャネルの作成もメタデータのエクスポートもできなくなります。これは、この時点で型情報を使用できないためです。型情報は、サービスと実際に対話する場合またはメタデータをエクスポートする場合に必要です。型情報を生成するには、コードを生成する必要があります。これについては、手順 4. ~ 5. で説明します。別の方法として、MetadataResolver ヘルパー クラスを使用することもできます。詳細については、次のトピックを参照してください。、「方法 : MetadataResolver を使用してバインディング メタデータを動的に取得する」を参照してください。 各コントラクトに型情報を生成します。
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.");
これで、この情報を使用できます。次の例では、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();