Procedimiento para importar metadatos a puntos de conexión de servicio
En este tema se explica cómo importar metadatos en una colección de puntos de conexión de servicio y usar el servicio que se define en la 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 puntos de conexión 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("http://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 del asistente MetadataResolver. Para obtener más información, consulte Procedimiento para usar MetadataResolver para obtener metadatos de enlace de forma dinámica.
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();