Comment : importer des métadonnées dans des points de terminaison de service
Cette rubrique explique comment importer des métadonnées dans une collection de points de terminaison de service et comment utiliser le service défini dans Getting Started, exemple. Cette rubrique montre comment créer une application cliente qui importe les métadonnées à partir du service, puis appelle la méthode Add sur le service.
Pour importer des métadonnées dans des points de terminaison de service
Déclarez un objet EndpointAddress et initialisez-le avec l'URI (Uniform Resource Identifier) de l'adresse d'échange de métadonnées (MEX) du service.
EndpointAddress mexAddress = new EndpointAddress("https://localhost:8000/ServiceModelSamples/service/mex");
Créez un MetadataExchangeClient en passant l'adresse MEX, puis appelez GetMetadata. Cette opération récupère les métadonnées du service.
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaSet = mexClient.GetMetadata();
Créez un WsdlImporter en passant les métadonnées précédemment récupérées, puis appelez ImportAllContracts. Cette opération génère une collection d'objets ContractDescription. Vous pouvez aussi appeler ImportAllEndpoints ou ImportAllBindings, selon vos besoins.
WsdlImporter importer = new WsdlImporter(metaSet); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Remarque : Après avoir importé les métadonnées, vous ne pourrez pas créer un canal client ou exporter les métadonnées. En effet, aucune information de type n'est disponible à ce stade. Les informations de type sont requises pour interagir concrètement avec le service ou exporter les métadonnées. Pour générer les informations de type, vous devez générer le code (comme indiqué aux étapes 4 et 5). Vous pouvez également utiliser la classe d'assistance MetadataResolver. Pour plus d'informations, consultez Comment : utiliser MetadataResolver pour obtenir des métadonnées de liaison dynamiquement. Générez des informations de type pour chaque contrat.
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.");
Vous pouvez désormais utiliser ces informations. L'exemple suivant génère un code source 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();