Cómo: Importar metadatos en extremos de servicio
En este tema se explica cómo importar los metadatos en una colección de extremos de servicio y utilizar el servicio definido en Ejemplo de introducción. En este tema se muestra cómo crear una aplicación cliente que importa los metadatos desde el servicio y, a continuación, llama al método Add en el servicio.
Para importar metadatos a extremos de servicio
Declare un objeto EndpointAddress e inicialícelo con el Identificador uniforme de recursos (URI) para la dirección del servicio de intercambio de metadatos (MEX).
EndpointAddress mexAddress = new EndpointAddress("https://localhost:8000/ServiceModelSamples/service/mex");
Cree MetadataExchangeClient, pasando la dirección de MEX y llame GetMetadata. Esto recupera los metadatos del servicio.
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaSet = mexClient.GetMetadata();
Cree WsdlImporter, pasando los metadatos previamente recuperados y llame ImportAllContracts. Esto genera una colección de los objetos ContractDescription. También podría llamar ImportAllEndpoints o ImportAllBindings, dependiendo de sus necesidades.
WsdlImporter importer = new WsdlImporter(metaSet); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Nota: Después de haber importado los metadatos, no podrá crear un canal de cliente o exportar los metadatos. Esto es porque ninguna información de tipo está disponible en este punto. Se exige información de tipo para interactuar realmente con el servicio o exportar los metadatos. Para generar la información de tipo, necesita generar el código, tal como se muestra en los pasos 4 y 5. También podría utilizar la clase auxiliar MetadataResolver. Para obtener más información, vea Cómo: Utilizar MetadataResolver para obtener dinámicamente metadatos de enlace. Genere información de tipo para cada contrato.
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.");
Ahora puede utilizar esta información. El ejemplo siguiente genera el código fuente 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();