通常咱們使用了scvutil命令自動生成了服務的客戶端代理類:程序員
例如:svcutil http://localhost:8000/?wsdl /o:FirstServiceClient.cs
命令中http://localhost:8000/?wsdl鏈接返回一個XML,該XML即爲元數據:用以描述如何與服務的終結點進行交互。正由於有元數據的存在,svcutil命令才能自動生成客戶端代理類。
元數據遵循Web服務描述語言(WSDL)標準,因此可被多種語言支持,除WCF的svcutil外,Java程序員也可以使用諸如WSDL2Java的工具生成Java語言的客戶端代理類。
WCF服務公開本身的元數據可採用兩種方案,一是使用基於HTTP-GET協議提供元數據,二是使用專門的終結點方式。
下面將講述如何經過配置文件來公開服務的元數據
以HTTP-GET方式公開元數據:
此方法咱們在咱們前述示例中已經使用
1.在Host項目配置文件中,<service>配置節點中指定behaviorConfiguration值爲 behaviorConfiguration
2.在<behaviors><serviceBehaviors>下添加一個name屬性爲 behaviorConfiguration的<behavior>節點
3.在<behavior>下添加子節點<serviceMetadata> 將httpGetEnabled屬性設爲true,經過此屬性啓用HTTP-GET元數據
4.以HTTP-GET方式公開的元數據可經過服務地址加wsdl參數的形式來獲取:如 http://localhost:8000/?wsdl
已終結點方式公開服務的元數據
此方案下,服務的元數據也是一個服務終結點,其形式與服務終結點徹底一致,只是endpoint中的綁定和契約是特定於元數據的,。
關於元數據的綁定類型有如下四種方式,分別對應不一樣的訪問協議:
對應於HTTP協議的mexHttpBinding
對應於HTTPS協議的mexHttpsBinding
對應於命名管道協議的mexNamedPipeBinding
對應於TCP協議的mexTcpBinding
在配置文件中元數據的終結點定義方式和咱們的服務終結點定義方式徹底一致,經過<endpoint>節點來定義,其中address屬性指定元數據的地址,一樣可使用絕對地址和相對地址,binding屬性指定元數據的綁定類型,即上述4種綁定類型之一,contract屬性指定契約類型,元數據的契約類型固定爲IMetadataExchange
如下配置文件爲示例添加了一個元數據地址,該元數據使用http協議,訪問路徑爲http://localhost:8000/mex
注意:以終結點的方式公開的元數據,沒法經過瀏覽器查看元數據內容
使用svcutil下載服務元數據
經過元數據URL來下載元數據:
WCF中咱們並不須要直接操做元數據,不過svctuil工具仍是提供了元數據下載工具,經過指定/t:metadata參數及元數據url便可下載服務的元數據,以下載上述經過終結點指定的元數據,可以使用以下命令:
svcutil /t:metadata http://localhost:8000/mex
固然,運行此命令以前,你須要先啓動咱們的服務。命令運行完成後,會在當前目錄生成三個文件:
tempuri.org.wsdl 服務的WSDL描述文檔
tempuri.org.xsd 服務的XML架構定義文檔
schemas.microsoft.com.2003.10.Serialization.xsd 包含一組.NET基礎類型的XML架構定義
後兩個xsd文檔在wsdl中被引用(xsd:import),經過這兩個XML架構定義文件,元數據導入工具能夠驗證wsdl元數據是否符合WSDL標準。
經過服務程序集來下載元數據:
若是服務類是使用WCF編寫的,則svcutil可直接使用服務的程序集(注意:不是宿主程序集)來生成元數據文檔,而服務也無需公佈本身的元數據,命令以下:
svcutil XfrogWCFService.dll --注意:試驗時,請先將當前路徑切換到XfrogWCFService.dll所在目錄
與使用元數據URL方式同樣,最終會產生一致的三個文檔。
經過下載的元數據生成客戶端代理類
使用svcutil下載的元數據文檔,咱們可使用svcutil命令來生成服務的客戶端代理類,而無需使用服務的元數據URL,假設當前目錄中存在上述三個元數據文件,則命令以下:
svcutil tempuri.org.* /o:FirstServiceClient.cs /config:App.config
命令執行成功後,會在當前目錄下生成客戶端的代理類的代碼文件及配置文件。
安全性
公開服務的元數據後,實際上使咱們的服務端多了一種被攻擊的可能,固然你可使用HTTPS安全鏈接綁定的終結點來保護你的元數據終結點,但若是你的客戶端一樣是使用WCF來實現的話,服務端能夠無需公開元數據,而客戶端使用離線元數據文檔來產生代理類。瀏覽器