閱讀目錄
一:前言
二:配置工作
三:通過中繼資料組建代理程式和設定檔
一:前言
. 這篇文章是與《一步一個腳印學習WCF之WCF概要—WCF服務的建立與調用HelloWorld執行個體,通過編碼方式(四) 》一文相對比寫的,如果其中有不明白的情參照連結文章。
二:配置工作
. 在Host工程裡面為我們的Host這一端添加了一些配置,這個配置有兩個方面,一個是方面關於Service的配置,也就是我們我們這個Host裡面載入的Service的配置。另外一個方面是關於Host裡面某些特定Service行為的配置。
在Host這一端我們來看設定檔
1:Service的配置
<service/>節點
1.1:在<services/>裡我們添加了一個<service/>,這個service的名稱就是我們前面實現的服務的名稱,格式name="HelloWorldService.HelloWorldService",就是我們的命名空間+具體實現服務的名稱。behaviorConfiguration="serviceBehavior",表示它服務的行為配置採用serviceBehavior這個策略
1 <service name="HelloWorldService.HelloWorldService" behaviorConfiguration="serviceBehavior">
1.2:我們看到暴露出了兩個端點出來,這兩個端點都是綁定Http協議,但是還是有區別的,上面的端點採用基本的Http進行綁定,下面的端點使用mexHttp進行綁定,這個mex是WCF裡用於中繼資料互動的一種特有方式,在我們進行中繼資料交換的時候,指定了由WCF內建的一個介面”IMetadataExchange“,這個介面的主要作用就是來完成中繼資料的交換,並且在後面指定了這個端點具體的地址“mex”。上面的基於“basicHttpBinding”的端點它所綁定的契約就是在《一步一個腳印學習WCF之WCF概要—WCF服務的建立與調用HelloWorld執行個體,通過編碼方式(四)》一文中的HelloWorldService.IHelloWorldService這個契約
1 <endpoint address="HelloWorldService" binding="basicHttpBinding" contract="HelloWorldService.IHelloWorldService" />2 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
1.3:在<endpoint/>這個節點描述完畢以後,然後就是<Host/>節點,這個service 它所運行在的Host,在Host裡面主要描述了一個基本的地址就是“http://localhost:8000”,所以對於“HelloWorldService”這個服務真實的地址是“http://localhost:8000/HelloWorldService”,那麼一樣中繼資料交換的地址是“http://localhost:8000/mex”,到這裡就完成了對Service的配置工作
1 <host>2 <baseAddresses>3 <add baseAddress="http://localhost:8000"/>4 </baseAddresses>5 </host>
2:Service行為的配置
<behaviors/>
在<behaviors/>裡我們可以指定服務具體的行為,<serviceMetadata httpGetBinding="true"/>是說服務的中繼資料是否能用Http協議Get出來,也就是說當我們應用了這個配置選項以後,中繼資料我們是允許Get方法操作的
1 <behaviors>2 <serviceBehaviors>3 <behavior name="serviceBehavior">4 <serviceMetadata httpGetBinding="true"/>5 </behavior>6 </serviceBehaviors>7 </behaviors>
三:通過中繼資料組建代理程式和設定檔
. 我們儲存我們在Host這端的設定檔,下面我們啟動Host,由於剛才我們在設定檔中已經指明了使用Http協議這麼一個服務以及8000它相應的連接埠,因此在瀏覽器我們可以通過輸入http://localhost:8000/來看到和這個服務相關的具體內容一,我們可以使用svcutil.exe這個工具,單擊http://localhost:8000/?WSDL看到具體的描述資訊在用戶端產生相應的Proxyl代碼,對個這個WSDL設定檔當中,我們可以看到我們指定的一些資訊,像我們使用什麼樣的協議進行傳遞等這些資訊都在WSDL裡面進行了非常詳細的描述二,我們已在Host這一端添加了相應的設定檔使得Host不但能夠對外提供基於Tcp協議位置在localhost連接埠在9000下的服務三,同時也提供基於Http協議位置在localhost連接埠在8000下的服務,那麼我們對比這兩個服務的話,通過寫代碼所作的這些事情事實上我們可以通過設定檔的方式來完成,這也就意味著我們在Host這一端希望對外提供一個服務的時候其實對於這個服務而言是不需要編寫任何的代碼,我們需要做的是在設定檔當中來完成對這個服務的配置就夠了。
. 示範在用戶端如何使用在Http協議下提供的這個服務,我們先啟動Host,我們進入到Client工程當中,在Client裡面添加一個引用,地址是http://localhost:8000/四,也就是提供基於Http協議訊息的Host,由Visual Studio會根據WSDL裡面的內容l來自動產生相應的代理檔案以及相應的設定檔五。在Reference.svcmap下面有個Reference.cs,在這個Reference.cs裡面有由系統自動為我們產生的代理類,在我們進行使用的時候,我們直接使用代理類來進行服務的操作。同樣在Client端產生了和Host端相關的的相應的設定檔以及裡面的配置資訊和配置參數,對於這些參數可以根據我們具體需求來進行具體的配置六。現在我們轉到Client端由於說系統已經為我們產生好了和這個IHelloWorldService契約相關的Proxyl代碼了,因此我們自己手動的代碼就不需要了,然後對於Proxyl的使用我們就不需要對通過CreateChannel這種方式來進行調用,我們可以直接Proxy.HelloWorldServiceContractClient proxy = new Proxy.HelloWorldServiceContractClient();通過執行個體化對象的方式來執行個體化一個新的Proxyl對象出來就可以了,那我們執行個體化出來的這個proxyl這個對象就自動包含了契約相關的資訊,在Proxyl產生以後我可以調用相應的方法來完成相應的任務,這樣就實現了基於Http協議的分布式調用。在WCF當中無論是我們使用基於http協議的訊息的傳遞還是使用基於Tcp協議的訊息傳遞都是遵循同一個模型來開發的,如果說我們開發了一個複雜系統在原來是使用Tcp協議來進行資料傳遞的,然而在實際部署過程中要改變成Http協議,那麼我們可以通過配置的方式修改一些參數就能夠項目從使用Tcp協議移植到使用Http協議上面
圖一
圖二
圖三
圖四
圖五
圖六
1:首先啟動Host端
2:然後啟動Client端
是不和《一步一個腳印學習WCF之WCF概要—WCF服務的建立與調用HelloWorld執行個體,通過編碼方式(四) 》一文中通過編碼方式的效果一樣