共用方式為


元數據架構概觀

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 可以在 MetadataSection.Metadata 屬性中包含下列項目:

System.ServiceModel.Description.MetadataReference實例會指向另一個元數據交換 (MEX) 端點,而System.ServiceModel.Description.MetadataLocation實例會使用 HTTP URL 指向元數據檔。 WCF 支援使用 WSDL 檔來描述服務端點、服務合約、系結、訊息交換模式、服務所實作的訊息和錯誤訊息。 服務所使用的數據類型會在使用 XML 架構的 WSDL 檔中描述。 如需詳細資訊,請參閱 架構匯入和導出。 您可以使用 WCF 匯出和匯入 WSDL 延伸模組,以取得服務行為、合約行為,以及擴充服務功能的綁定項。 如需詳細資訊,請參閱 匯出 WCF 延伸模組的自定義元數據

匯出服務元數據

在 WCF 中, 元數據匯出 是描述服務端點並將其投影成平行、標準化表示的程式,用戶端可用來瞭解如何使用服務。 若要從 ServiceEndpoint 實例導出元數據,請使用抽象類的實作 MetadataExporterSystem.ServiceModel.Description.MetadataExporter 的實作會產生元數據,這些元數據封裝在 MetadataSet 的實例中。

類別 System.ServiceModel.Description.MetadataExporter 提供一個架構來產生原則表達式,描述端點系結的功能和需求及其相關聯的作業、訊息和錯誤。 這些政策表達式會在PolicyConversionContext實例中擷取。 然後,實 System.ServiceModel.Description.MetadataExporter 作可以將這些原則表達式附加至它產生的元數據。

System.ServiceModel.Description.MetadataExporter 在生成 System.ServiceModel.Channels.BindingElement 物件供 IPolicyExportExtension 實作使用時,會在 ServiceEndpoint 的系結中呼叫每個實作 PolicyConversionContext 介面的 System.ServiceModel.Description.MetadataExporter。 您可以在IPolicyExportExtension類型的自定義實作上實作BindingElement介面,以匯出新的政策斷言。

WsdlExporter 類型是 WCF 隨附之 System.ServiceModel.Description.MetadataExporter 抽象類的實作。 此 WsdlExporter 類型會產生具有附加原則表達式的WSDL元數據。

若要針對服務端點中的端點行為、合約行為或綁定項匯出自定義 WSDL 元數據或 WSDL 延伸模組,您可以實 IWsdlExportExtension 作 介面。 WsdlExporter會檢查ServiceEndpoint實例,以便在產生 WSDL 文件時找出實作IWsdlExportExtension介面的綁定元素、作業行為、合約行為和端點行為。

發佈服務元數據

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提供元數據發行通訊協議的實作。 你也可以在執行時透過 System.ServiceModel.Description.ServiceMetadataExtension 存取 Metadata 該屬性來取得服務的中繼資料。

謹慎

如果您在應用程式組態檔中新增 MEX 端點,然後在程式代碼中嘗試將 新增 ServiceMetadataBehavior 至服務主機,則會收到下列例外狀況:

System.InvalidOperationException:服務 Service1 所實作的合約列表中找不到合約名稱 'IMetadataExchange'。 將 ServiceMetadataBehavior 新增至組態檔,或直接新增至 ServiceHost,以啟用此合約的支援。

您可以藉由在組態檔中新增 ServiceMetadataBehavior 或同時新增端點和 ServiceMetadataBehavior 程式代碼來解決此問題。

如需在應用程式組態檔中新增 ServiceMetadataBehavior 的範例,請參閱 用戶入門。 如需在程式代碼中新增 ServiceMetadataBehavior 的範例,請參閱 自我裝載 範例。

謹慎

發佈服務元數據時,若公開兩個不同的服務合約,其中每個合約都包含相同名稱的作業,則會拋出例外狀況。 例如,如果您的服務公開具備名為 ICarService 且具有作業 Get(Car c) 的服務合約,並且相同的服務公開名為 IBookService 且具有作業 Get(Book b) 的服務合約,則在產生服務的元數據時會擲回例外狀況或顯示錯誤訊息。 若要解決此問題,請執行下列其中一項:

  • 重新命名其中一個作業。
  • 請將Name設定為不同的名稱。
  • 使用 Namespace 屬性,將其中一個作業的命名空間設定為不同的命名空間。

擷取服務元數據

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 一實例。 您可以藉由覆寫ChannelFactoryBase虛擬方法來變更或取代System.ServiceModel.Description.MetadataExchangeClient所使用的GetChannelFactory實例。 同樣地,您可以覆寫 System.Net.HttpWebRequest 虛擬方法,來變更或取代 System.ServiceModel.Description.MetadataExchangeClient 所使用的 MetadataExchangeClient.GetWebRequest 實例,以發出 HTTP/GET 請求。

您可以使用 Svcutil.exe 工具來擷取 WS-MetadataExchange 或 HTTP/GET 要求的服務元數據,並傳遞 /target:metadata 參數和位址。 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 屬性中呼叫 IPolicyImportExtension 介面的 PolicyImportExtensions 實作,接著處理原則,作為匯入元數據的一部分。

您可以通過將您自己的System.ServiceModel.Description.MetadataImporter介面的實作新增至IPolicyImportExtension實例上的PolicyImportExtensions集合來增加匯入新政策斷言的支援至System.ServiceModel.Description.MetadataImporter。 或者,您可以在用戶端應用程式組態檔中註冊原則匯入延伸模組。

System.ServiceModel.Description.WsdlImporter 類型是 WCF 隨附之 System.ServiceModel.Description.MetadataImporter 抽象類的實作。 類型 System.ServiceModel.Description.WsdlImporter 匯入 WSDL 元數據,該元數據包含綁定在 MetadataSet 物件中的附加政策。

您可以實作 IWsdlImportExtension 介面,然後將您的實作添加至 WsdlImportExtensions 實例上的 System.ServiceModel.Description.WsdlImporter 屬性,以支援匯入 WSDL 延伸模組。 System.ServiceModel.Description.WsdlImporter也可以載入在客戶端應用程式設定檔中註冊的System.ServiceModel.Description.IWsdlImportExtension介面的實作。

動態系結

當端點的系結發生變更時,您可以動態更新用於創建服務端點的通信通道的系結,或者當您想要創建通信通道到一個使用相同合約但具有不同系結的端點時,也可以進行更新。 你可以用 MetadataResolver 靜態類別在執行時為實作特定合約的服務端點擷取並匯入元資料。 然後,您可以使用匯入 System.ServiceModel.Description.ServiceEndpoint 的物件,將用戶端或通道處理站建立至所需的端點。

另請參閱