在 Windows Communication Foundation (WCF) 中,元數據匯入是從其元數據將服務或其部件的抽象表示生成出來的過程。 例如,WCF 可以從服務的 WSDL 檔匯入 ServiceEndpoint 實例、 Binding 實例或 ContractDescription 實例。 若要在WCF 中匯入服務元數據,請使用抽象類的實作 System.ServiceModel.Description.MetadataImporter 。 衍生自MetadataImporter類別的類型能夠匯入利用WCF WS-Policy匯入邏輯的元數據格式。
自訂元數據是由系統提供的元數據匯入工具無法匯入的 XML 元素所組成。 通常,這包括自定義 WSDL 延伸模組和自定義策略聲明。
本節說明如何匯入自定義 WSDL 延伸模組和原則判斷提示。 它不會專注於匯入程式本身。 如需如何使用匯出和匯入元數據的類型,不論元數據是自定義還是系統支援,請參閱 匯出和匯入元數據。
概觀
此 System.ServiceModel.Description.WsdlImporter 類型是 WCF 隨附之 MetadataImporter 抽象類的實作。 類型 WsdlImporter 匯入 WSDL 元數據,該元數據包含綁定在 System.ServiceModel.Description.MetadataSet 物件中的附加政策。 默認匯入工具無法辨識的原則判斷提示和 WSDL 延伸模組會傳遞至任何已註冊的自定義原則和 WSDL 匯入工具。 一般而言,匯入工具會實作以支援使用者定義的綁定項,或修改匯入的合約。
本節說明:
如何實作和使用 System.ServiceModel.Description.IWsdlImportExtension 介面,這會先將 WSDL 數據公開給自定義匯入工具,再產生描述和產生程式代碼。 您可以使用這個介面來檢查或修改使用一組指定元數據執行的描述類型和程式代碼編譯。
如何實作和使用 System.ServiceModel.Description.IPolicyImportExtension 介面,此介面會在產生描述物件之前向匯入工具公開政策聲明。 您可以使用這個介面,根據下載的原則來檢查或修改系結或合約。
如需匯出自定義 WSDL 和原則判斷提示的詳細資訊,請參閱 匯出 WCF 延伸模組的自定義元數據。
匯入自定義 WSDL 延伸模組
若要新增匯入 WSDL 延伸模組的支援,請實 IWsdlImportExtension 作 介面,然後將您的實作新增至 WsdlImportExtensions 屬性。 WsdlImporter 還可以載入您應用程式組態檔中已註冊的 IWsdlImportExtension 介面實作。 請注意,根據預設會註冊許多 WSDL 匯入工具,且已註冊的 WSDL 匯入工具的順序相當重要。
當自訂 WSDL 匯入工具被 WsdlImporter 載入並使用時,會先呼叫 BeforeImport 方法,以在匯入過程之前啟用元數據的修改。 接下來,系統會匯入合約,然後 ImportContract 呼叫 方法來修改從元數據匯入的合約。 最後,呼叫 ImportEndpoint 方法以啟用已匯入端點的修改。
如需詳細資訊,請參閱 如何:匯入自定義 WSDL。
匯入自定義政策宣告
類型和 WsdlImporterServiceModel 元數據公用程式(Svcutil.exe)自動處理各種附加至 WSDL 文件中的政策表示式內的政策斷言類型。 這些工具會收集、正規化和合併附加至 WSDL 系結和 WSDL 埠的原則表達式。
若要新增對匯入自訂原則斷言的支援,請實現IPolicyImportExtension介面,然後將您的實現新增至PolicyImportExtensions屬性。 MetadataImporter 還可以載入您應用程式組態檔中已註冊的 IPolicyImportExtension 介面實作。 請注意,預設情況下會註冊一些策略匯入程式,且已註冊的策略匯入程式的順序相當重要。
元數據系統會針對附加至訊息、操作和端點政策主題的每個政策替代方案組合,在所有已註冊的政策匯入擴展上反覆呼叫 IPolicyImportExtension.ImportPolicy 方法。 匯入 WSDL 連接埠時,會在呼叫原則匯入延伸模組之前先合併附加於連接埠及其對應 WSDL 系結的原則。 替代策略可透過 PolicyConversionContext 做為 PolicyAssertionCollection 物件提供。 每個 PolicyAssertionCollection 都是 由 XmlElement 物件表示的原則判斷提示集合。
Contract物件上的BindingElements和PolicyConversionContext屬性,公開了從WSDL匯入的ContractDescription和BindingElement物件。 原則匯入延伸模塊會透過尋找特定原則判斷提示類型的實例,對ContractDescription或BindingElement對象進行相應的變更,然後從對應的PolicyAssertionCollection實例中移除這些原則判斷提示,以便處理這些提示。
屬性 wsp:Optional 和巢狀原則表達式不會正規化,因此原則匯入延伸模塊必須處理這些原則建構。 此外,原則匯入延伸模組可能會使用相同的 ContractDescription 和 BindingElement 物件多次呼叫,因此原則匯入延伸模組應該對這種行為強固。
這很重要
無效或不正確的元數據可能會被傳遞至匯入程序。 確定自定義匯入工具對所有 XML 形式都強固。