方法: メタデータをサービス エンドポイントにインポートする
このトピックでは、メタデータをサービス エンドポイントのコレクションにインポートし、入門のページに定義されているサービスを使用する方法を説明します。 また、サービスからメタデータをインポートし、次にそのサービスに対して Add
メソッドを呼び出すクライアント アプリケーションを作成する方法についても説明します。
メタデータをサービス エンドポイントにインポートするには
EndpointAddress オブジェクトを定義し、サービスの metadata exchange (MEX) アドレスの URI (Uniform Resource Identifier) を使ってそのオブジェクトを初期化します。
EndpointAddress mexAddress = new EndpointAddress("http://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();
Note
メタデータのインポートが完了すると、クライアント チャネルの作成もメタデータのエクスポートもできなくなります。 これは、この時点で型情報を使用できないためです。 型情報は、サービスと実際に対話する場合またはメタデータをエクスポートする場合に必要です。 型情報を生成するには、コードを生成する必要があります。これについては、手順 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();