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