共用方式為


HOW TO:撰寫 ServiceContractGenerator 的擴充

本主題說明如何撰寫 ServiceContractGenerator 的擴充。您可以在作業行為上實作 IOperationContractGenerationExtension 介面,或在合約行為上實作 IServiceContractGenerationExtension 介面來達到這個目的。本主題說明如何在合約行為上實作 IServiceContractGenerationExtension 介面。

ServiceContractGenerator 會從 ServiceEndpointContractDescriptionBinding 執行個體中產生服務合約、用戶端類型,與用戶端組態。一般來說,您可以從服務中繼資料匯入 ServiceEndpointContractDescription,和 Binding 執行個體,然後使用這些執行個體來產生程式碼以呼叫服務。此範例會使用 IWsdlImportExtension 實作來處理 WSDL 附註,然後將程式碼產生擴充加入至匯入的合約中,以便在產生的程式碼中產生註解。

若要撰寫 ServiceContractGenerator 的擴充

  1. 實作 IServiceContractGenerationExtension。若要修改產生的服務合約,請使用已傳入至 GenerateContract 方法的 ServiceContractGenerationContext 執行個體。

    public void GenerateContract(ServiceContractGenerationContext context)
    {
        Console.WriteLine("In generate contract.");
    context.ContractType.Comments.AddRange(Formatter.FormatComments(commentText));
    }
    
  2. 在相同類別上實作 IWsdlImportExtensionImportContract 方法可以處理特定的 WSDL 擴充 (在此情況下為 WSDL 附註),方法是將程式碼產生擴充加入至下列匯入的 ContractDescription 執行個體。

    public void ImportContract(WsdlImporter importer, WsdlContractConversionContext context)
       {
                // Contract documentation
             if (context.WsdlPortType.Documentation != null)
             {
                    context.Contract.Behaviors.Add(new WsdlDocumentationImporter(context.WsdlPortType.Documentation));
             }
             // Operation documentation
             foreach (Operation operation in context.WsdlPortType.Operations)
             {
                if (operation.Documentation != null)
                {
                   OperationDescription operationDescription = context.Contract.Operations.Find(operation.Name);
                   if (operationDescription != null)
                   {
                            operationDescription.Behaviors.Add(new WsdlDocumentationImporter(operation.Documentation));
                   }
                }
             }
          }
          public void BeforeImport(ServiceDescriptionCollection wsdlDocuments, XmlSchemaSet xmlSchemas, ICollection<XmlElement> policy) 
            {
                Console.WriteLine("BeforeImport called.");
            }
    
          public void ImportEndpoint(WsdlImporter importer, WsdlEndpointConversionContext context) 
            {
                Console.WriteLine("ImportEndpoint called.");
            }
    
  3. 將 WSDL 匯入工具加入至您的用戶端組態。

    <metadata>
      <wsdlImporters>
        <extension type="Microsoft.WCF.Documentation.WsdlDocumentationImporter, WsdlDocumentation" />
      </wsdlImporters>
    </metadata>
    
  4. 在用戶端程式碼中,建立 MetadataExchangeClient 並呼叫 GetMetadata

                MetadataExchangeClient mexClient = new MetadataExchangeClient(metadataAddress);
                mexClient.ResolveMetadataReferences = true;
                MetadataSet metaDocs = mexClient.GetMetadata();
    
  5. 建立 WsdlImporter 並呼叫 ImportAllContracts

    WsdlImporter importer = new WsdlImporter(metaDocs);            System.Collections.ObjectModel.Collection<ContractDescription> contracts = importer.ImportAllContracts();
    
  6. 為每個合約建立 ServiceContractGenerator 並呼叫 GenerateServiceContractType

    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.");
    
  7. 在實作 IServiceContractGenerationExtension 的特定合約上,會針對每個合約行為自動呼叫 GenerateContract。接著此方法會修改傳入的 ServiceContractGenerationContext。在此範例中,會加入一些註解。

請參閱

工作

HOW TO:匯入自訂 WSDL

概念

中繼資料