Como: Importar metadados para pontos de extremidade de serviço
Este tópico explica como importar metadados para uma coleção de pontos de extremidade de serviço e usar o serviço definido em Introdução. Este tópico mostra como criar um aplicativo cliente que importa metadados do serviço e, em seguida, chama o Add
método no serviço.
Para importar metadados para pontos de extremidade de serviço
Declare um EndpointAddress objeto e inicialize-o com o URI (Uniform Resource Identifier) para o endereço de troca de metadados (MEX) do serviço.
EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
Crie um MetadataExchangeClient, passando o endereço MEX e ligue para GetMetadata. Isso recupera os metadados do serviço.
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress); mexClient.ResolveMetadataReferences = true; MetadataSet metaSet = mexClient.GetMetadata();
Crie um WsdlImporter, passando os metadados recuperados anteriormente e chame ImportAllContracts. Isso gera uma coleção de ContractDescription objetos. Você também pode ligar ImportAllEndpoints ou ImportAllBindings, dependendo de suas necessidades.
WsdlImporter importer = new WsdlImporter(metaSet); System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
Nota
Depois de importar os metadados, você não poderá criar um canal de cliente ou exportar os metadados. Isso ocorre porque nenhuma informação de tipo está disponível neste momento. As informações de tipo são necessárias para realmente interagir com o serviço ou exportar metadados. Para gerar as informações de tipo, você precisa gerar código, mostrado nas etapas 4 e 5. Como alternativa, você pode usar a MetadataResolver classe auxiliar. Para obter mais informações, consulte Como usar MetadataResolver para obter metadados de vinculação dinamicamente.
Gere informações 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.");
Agora você pode usar essas informações. O exemplo a seguir gera código-fonte 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();