Udostępnij za pośrednictwem


Instrukcje: Importowanie metadanych do punktów końcowych usług

W tym temacie opisano sposób importowania metadanych do kolekcji punktów końcowych usługi i używania usługi zdefiniowanej w temacie Wprowadzenie. W tym temacie pokazano, jak utworzyć aplikację kliencką, która importuje metadane z usługi, a następnie wywołuje metodę Add w usłudze.

Aby zaimportować metadane do punktów końcowych usługi

  1. Zadeklaruj EndpointAddress obiekt i zainicjuj go za pomocą identyfikatora URI (Uniform Resource Identifier) dla adresu wymiany metadanych (MEX) usługi.

    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
    
  2. Utwórz element MetadataExchangeClient, przekazując adres MEX i wywołaj metodę GetMetadata. Spowoduje to pobranie metadanych z usługi.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaSet = mexClient.GetMetadata();
    
  3. Utwórz obiekt , przekazując wcześniej pobrane metadane i wywołaj metodę WsdlImporterImportAllContracts. Spowoduje to wygenerowanie kolekcji ContractDescription obiektów. Możesz również wywołać metodę ImportAllEndpoints lub ImportAllBindings, w zależności od potrzeb.

    WsdlImporter importer = new WsdlImporter(metaSet);
    System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
    

    Uwaga

    Po zaimportowaniu metadanych nie będzie można utworzyć kanału klienta ani wyeksportować metadanych. Dzieje się tak, ponieważ w tym momencie nie są dostępne żadne informacje o typie. Informacje o typie są wymagane do rzeczywistej interakcji z usługą lub eksportowania metadanych. Aby wygenerować informacje o typie, musisz wygenerować kod, pokazany w krokach 4 i 5. Alternatywnie można użyć MetadataResolver klasy pomocnika. Aby uzyskać więcej informacji, zobacz How to: Use MetadataResolver to Obtain Binding Metadata Dynamiczne uzyskiwanie metadanych.

  4. Generowanie informacji o typie dla każdego kontraktu.

    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.");
    
  5. Teraz możesz użyć tych informacji. Poniższy przykład generuje kod źródłowy języka 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();
    

Zobacz też