共用方式為


中繼資料架構概觀

Windows Communication Foundation (WCF) 可提供豐富的基礎結構,讓您匯出、發行、擷取與匯入服務中繼資料。WCF 服務使用中繼資料來說明如何與服務端點互動,以便 Svcutil.exe 之類的工具可以自動產生用戶端程式碼來存取服務。

組成 WCF 中繼資料基礎結構的大部分型別都駐留在 System.ServiceModel.Description 命名空間裡。

WCF 使用 ServiceEndpoint 類別來說明服務中的端點。您可以使用 WCF 來產生服務端點的中繼資料,或是匯入服務中繼資料來產生 ServiceEndpoint 執行個體。

WCF 會將服務的中繼資料表示為 MetadataSet 型別的執行個體,而其所屬結構將與 WS-MetadataExchange 中定義的中繼資料序列化格式緊密結合。MetadataSet 型別會與實際的服務中繼資料包裹在一起,例如 Web 服務描述語言 (WSDL) 文件、XML 結構描述文件,或是 WS-Policy 運算式,做為 MetadataSection 執行個體集合。每個 System.ServiceModel.Description.MetadataSection 執行個體都包含特定的中繼資料方言與一個識別元。System.ServiceModel.Description.MetadataSection 可能會在其 System.ServiceModel.Description.MetadataSection.Metadata 屬性中包含下列項目

System.ServiceModel.Description.MetadataReference 執行個體會指向另一個中繼資料交換 (MEX) 端點,而 System.ServiceModel.Description.MetadataLocation 執行個體則是透過 HTTP URL 指向中繼資料文件。WCF 支援使用 WSDL 文件來說明服務端點、服務合約、繫結、訊息交換模式、訊息與服務所實作的錯誤訊息。服務所使用的資料型別會透過 XML 結構描述於 WSDL 文件中說明 (如需詳細資訊,請參閱 結構描述匯入和匯出)。您可以針對服務行為、合約行為,與可延伸服務功能的繫結項目,使用 WCF 來匯出與匯入 WSDL 延伸。如需詳細資訊,請參閱 匯出 WCF 擴充的自訂中繼資料).

匯出服務中繼資料

在 WCF 中,「中繼資料匯出」(Metadata Export) 這項程序會描述服務端點並將其投射至並行標準化表示法,以供用戶端用來了解如何使用服務。若要從 ServiceEndpoint 執行個體匯出中繼資料,請使用 MetadataExporter 抽象類別的實作。System.ServiceModel.Description.MetadataExporter 實作會產生可封裝到 MetadataSet 執行個體的中繼資料。

System.ServiceModel.Description.MetadataExporter 類別所提供的架構可產生原則運算式,用來說明端點繫結及其相關作業、訊息,與錯誤的各項功能與需求。這些原則運算式是在 PolicyConversionContext 執行個體中擷取。System.ServiceModel.Description.MetadataExporter 實作可接著將這些原則運算式附加到所產生的中繼資料中。

在產生 PolicyConversionContext 物件以供 System.ServiceModel.Description.MetadataExporter 實作使用時,System.ServiceModel.Description.MetadataExporter 會呼叫每個可於 ServiceEndpoint 繫結中實作 IPolicyExportExtension 介面的 System.ServiceModel.Channels.BindingElement。您可以在自訂的 BindingElement 型別實作中實作 IPolicyExportExtension 介面,以匯出新原則判斷提示。

WsdlExporter 型別是包含在 WCF 中的 System.ServiceModel.Description.MetadataExporter 抽象類別的實作。WsdlExporter 型別會產生包含附加原則運算式的 WSDL 中繼資料。

若要針對端點行為、合約行為,或服務端點中的繫結項目匯出自訂 WSDL 中繼資料或 WSDL 延伸,可以實作 IWsdlExportExtension 介面。產生 WSDL 文件時,WsdlExporter 會尋找 ServiceEndpoint 執行個體,看看是否有可實作 IWsdlExportExtention 介面的繫結項目、作業行為、合約行為,以及端點行為。

發行服務中繼資料

WCF 服務會藉由公開一個或多個中繼資料端點以發行中繼資料。發行服務中繼資料會使用標準化的通訊協定 (例如 MEX 和 HTTP/GET 要求) 來提供服務中繼資料。中繼資料端點與其他服務端點相似的地方,在於都有位址、繫結和合約。您可以透過組態或程式碼,將中繼資料端點新增至服務主機。

若要發行 WCF 服務的中繼資料端點,您必須先將 ServiceMetadataBehavior 服務行為的執行個體新增至服務。將 System.ServiceModel.Description.ServiceMetadataBehavior 執行個體新增至服務,會藉由公開一或多個中繼資料端點來提升服務發行中繼資料的能力。一旦您新增了 System.ServiceModel.Description.ServiceMetadataBehavior 服務行為之後,就可以接著公開支援 MEX 通訊協定的中繼資料端點,或公開回應 HTTP/GET 要求的中繼資料端點。

若要新增使用 MEX 通訊協定的中繼資料端點,請將服務端點新增至使用稱為 IMetadataExchange 服務合約的服務主機。WCF 會定義包含使用此服務合約名稱的 IMetadataExchange 介面。WS-MetadataExchange 端點或 MEX 端點都可以使用靜態處理站方法在 MetadataExchangeBindings 類別上所公開的四個預設繫結中的其中一個,以比對 WCF 工具 (例如 Svcutil.exe) 使用的預設繫結。您也可以使用自訂繫結設定 MEX 中繼資料端點。

ServiceMetadataBehavior 會使用 System.ServiceModel.Description.WsdlExporter 匯出服務中所有服務端點的中繼資料。如需 從服務匯出中繼資料的詳細資訊,請參閱匯出和匯入中繼資料

ServiceMetadataBehavior 會將 ServiceMetadataExtension 執行個體新增為服務主機的延伸以提升您的服務主機效能。System.ServiceModel.Description.ServiceMetadataExtension 為中繼資料發行通訊協定提供實作。您也可以藉由存取 Metadata 屬性,使用 System.ServiceModel.Description.ServiceMetadataExtension 在執行階段取得服務的中繼資料。

擷取服務中繼資料

WCF 可以使用像是 WS-MetadataExchange 和 HTTP 的標準化通訊協定來擷取服務中繼資料。這兩種通訊協定都由 MetadataExchangeClient 型別所支援。您可以藉由提供位址及選擇性繫結,來擷取使用 System.ServiceModel.Description.MetadataExchangeClient 型別的服務中繼資料。System.ServiceModel.Description.MetadataExchangeClient 執行個體使用的繫結可以是以下預設繫結之一:MetadataExchangeBindings 靜態類別、使用者提供的繫結,或是從 IMetadataExchange 合約的端點組態載入的繫結。System.ServiceModel.Description.MetadataExchangeClient 也可以使用 HttpWebRequest 型別將 HTTP URL 參照解析為中繼資料。

根據預設,System.ServiceModel.Description.MetadataExchangeClient 執行個體會繫結至單一的 ChannelFactoryBase 執行個體。您可以覆寫 GetChannelFactory 虛擬方法,以變更或取代由 System.ServiceModel.Description.MetadataExchangeClient 使用的 ChannelFactoryBase 執行個體。同樣地,您可以覆寫 System.ServiceModel.Description.MetadataExchangeClient.GetWebRequest(System.Uri,System.String,System.String) 虛擬方法,以變更或取代由 System.ServiceModel.Description.MetadataExchangeClient 使用的 System.Net.HttpWebRequest 執行個體。

您可以使用 Svcutil.exe 工具並將 /target:metadata 參數傳遞至某個位址,以使用 WS-MetadataExchange 或 HTTP/GET 要求來擷取服務中繼資料。Svcutil.exe 會在指定的位址下載中繼資料,並將檔案儲存到磁碟中。Svcutil.exe 會在內部使用 System.ServiceModel.Description.MetadataExchangeClient 執行個體,而且會從應用程式組態檔載入 MEX 端點組態,而其名稱必須符合傳遞至 Svcutil.exe 的位址 (如果存在的話) 配置。否則,Svcutil.exe 預設會使用 MetadataExchangeBindings 靜態處理站型別所定義的其中一個繫結。

匯入服務中繼資料

在 WCF 中,中繼資料匯入指的是從中繼資料中產生服務的抽象表示法或其元件部分的處理序。例如,WCF 可以從 WSDL 文件中為服務匯入 ServiceEndpoint 執行個體、Binding 執行個體或 ContractDescription 執行個體。若要將服務中繼資料匯入 WCF,請使用 MetadataImporter 抽象類別的實作。衍生自 System.ServiceModel.Description.MetadataImporter 類別實作的型別,會支援匯入中繼資料格式以利用 WCF 中的 WS-Policy 匯入邏輯。

System.ServiceModel.Description.MetadataImporter 實作會收集附加至 PolicyConversionContext 物件內服務中繼資料的原則運算式。System.ServiceModel.Description.MetadataImporter 接著會呼叫 PolicyImportExtensions 屬性中的 IPolicyImportExtension 介面實作,將原則當成匯入中繼資料作業的一部分來處理。

您可以將自己的 IPolicyImportExtension 介面實作新增至 System.ServiceModel.Description.MetadataImporter 執行個體上的 PolicyImportExtensions 集合,以便在將新原則判斷提示匯入 System.ServiceModel.Description.MetadataImporter 時提供更多支援。或者,您可以在自己的用戶端應用程式組態檔中註冊自己的原則匯入延伸。

System.ServiceModel.Description.WsdlImporter 類型是包含在 WCF 中的 System.ServiceModel.Description.MetadataImporter 抽象類別的實作。System.ServiceModel.Description.WsdlImporter 類型會匯入具有與 MetadataSet 物件組合在一起之附加原則的 WSDL 中繼資料。

您可以實作 IWsdlImportExtension 介面,然後將實作新增至 System.ServiceModel.Description.WsdlImporter 執行個體上的 WsdlImportExtensions 屬性中,以便在匯入 WSDL 延伸時提供更多支援。System.ServiceModel.Description.WsdlImporter 也可以將 System.ServiceModel.Description.IWsdlImportExtension 介面 (在您的用戶端應用程式組態檔中註冊) 的實作載入。

動態繫結

當端點繫結變更,或當您想要建立使用相同合約但具有不同繫結的端點通道時,可以針對用來建立服務端點通道的繫結進行動態更新。您可以針對可實作特定合約的服務端點使用 MetadataResolver 靜態類別,於執行階段擷取並匯入中繼資料。您可以接著使用匯入的 System.ServiceModel.Description.ServiceEndpoint 物件來建立所需端點的用戶端或通道處理站。

請參閱

參考

System.ServiceModel.Description

概念

中繼資料格式
匯出和匯入中繼資料
發行中繼資料
擷取中繼資料
使用中繼資料
中繼資料的安全性考量

其他資源

擴充中繼資料系統