Share via


Vorgehensweise: Importieren von Metadaten in Dienstendpunkte

In diesem Thema wird erläutert, wie Sie Metadaten in eine Auflistung der Dienstendpunkte importieren und den unter Erste Schritte definierten Dienst verwenden. Im Thema wird gezeigt, wie Sie eine Clientanwendung erstellen, die Metadaten aus dem Dienst importiert und anschließend dieAdd-Methode für den Dienst aufruft.

So importieren Sie Metadaten in Dienstendpunkte

  1. Deklarieren Sie ein EndpointAddress-Objekt, und initialisieren Sie es mit dem Uniform Resource Identifier (URI) für die Metadatenaustausch-Adresse (MEX) des Dienstes.

    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
    
  2. Erstellen Sie einen MetadataExchangeClient, der die MEX-Adresse übergibt, und rufen Sie GetMetadata auf. Auf diese Weise werden die Metadaten aus dem Dienst abgerufen.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaSet = mexClient.GetMetadata();
    
  3. Erstellen Sie einen WsdlImporter, der die vorher abgerufenen Metadaten übergibt, und rufen Sie ImportAllContracts auf. Dadurch wird eine Auflistung der ContractDescription-Objekte erzeugt. Sie können je nach Ihren Anforderungen auch ImportAllEndpoints oder ImportAllBindings aufrufen.

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

    Hinweis

    Nachdem Sie die Metadaten importiert haben, können Sie keinen Clientkanal mehr erstellen oder die Metadaten exportieren. Dies liegt daran, dass an diesem Punkt keine Typinformationen verfügbar sind. Typinformationen sind erforderlich, um direkt mit dem Dienst zu interagieren oder Metadaten zu exportieren. Um die Typinformationen zu erzeugen, müssen Sie den in den Schritten 4 und 5 gezeigten Code generieren. Alternativ dazu können Sie auch die MetadataResolver-Hilfsklasse verwenden. Weitere Informationen finden Sie unter Vorgehensweise: MetadataResolver zum dynamischen Abrufen von Bindungsmetadaten verwenden.

  4. Generieren Sie Typinformationen für jeden Vertrag.

    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. Jetzt können Sie diese Informationen verwenden. Im folgenden Beispiel wird C#-Quellcode generiert.

    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();
    

Siehe auch