共用方式為


作法:將中繼資料匯入服務端點

此主題說明如何將中繼資料匯入服務端點的集合中,以及如何使用在使用者入門中定義的服務。 本主題將示範如何建立用戶端應用程式,從服務匯入中繼資料,然後在服務上呼叫 Add 方法。

將中繼資料匯入服務端點

  1. 請宣告 EndpointAddress 物件,並使用服務之中繼資料交換 (MEX) 位址的統一資源識別元 (URI) 來初始化該物件。

    EndpointAddress mexAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/service/mex");
    
  2. 建立 MetadataExchangeClient,在 MEX 位址中傳遞,然後呼叫 GetMetadata。 這會從服務擷取中繼資料。

    MetadataExchangeClient mexClient = new MetadataExchangeClient(mexAddress);
    mexClient.ResolveMetadataReferences = true;
    MetadataSet metaSet = mexClient.GetMetadata();
    
  3. 建立 WsdlImporter,在先前擷取的中繼資料中傳遞,然後呼叫 ImportAllContracts。 這會產生 ContractDescription 物件的集合。 您也可以呼叫 ImportAllEndpointsImportAllBindings,視您的需要而定。

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

    注意

    在您匯入中繼資料之後,將無法建立用戶端通道或匯出中繼資料。 這是因為此時沒有可用的型別資訊。 實際與服務互動或匯出中繼資料需要型別資訊。 如果要產生型別資訊,您需要產生程式碼,如步驟 4 和 5 中所示。 或者,您可以使用 MetadataResolver 協助程式類別。 如需詳細資訊,請參閱操作方法:使用 MetadataResolver 來動態取得繫結中繼資料

  4. 產生各個合約的型別資訊。

    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. 現在您可以使用此資訊。 下列範例會產生 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();
    

另請參閱