Procedura: importare metadati negli endpoint del servizio

In questo argomento viene illustrato come importare metadati in una raccolta di endpoint del servizio e usare il servizio definito in Introduzione. In questo argomento viene inoltre illustrato come creare un'applicazione client che importa metadati dal servizio e quindi chiama il metodo Add sul servizio.

Per importare metadati negli endpoint del servizio

  1. Dichiarare un oggetto EndpointAddress e inizializzarlo con l'URI (Uniform Resource Identifier) per l'indirizzo di scambio dei metadati (MEX, metadata exchange) del servizio.

    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
    
  2. Creare un MetadataExchangeClient, passando l'indirizzo MEX, e chiamare GetMetadata. In questo modo vengono recuperati i metadati dal servizio.

    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaSet = mexClient.GetMetadata();
    
  3. Creare un WsdlImporter, passando i metadati precedentemente recuperati, e chiamare ImportAllContracts. In questo modo viene generata una raccolta di oggetti ContractDescription. È anche possibile chiamare ImportAllEndpoints o ImportAllBindings, in base alle esigenze.

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

    Nota

    Dopo avere importato i metadati, non sarà possibile creare un canale client o esportare i metadati poiché in questa fase non è disponibile alcuna informazione sul tipo. Le informazioni sul tipo sono necessarie per interagire con il servizio o esportare i metadati. Per generare informazioni sul tipo, è necessario generare il codice mostrato nei passaggi 4 e 5. In alternativa, è possibile usare la classe di supporto MetadataResolver. Per altre informazioni, vedere Procedura: usare la classe MetadataResolver per ottenere dinamicamente i metadati di associazione.

  4. Generare informazioni sul tipo per ogni contratto.

    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. A questo punto è possibile usare le informazioni. Nell'esempio seguente viene generato il codice sorgente 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();
    

Vedi anche