WCF中Host和Client端都可以使用app.config 進行配置,然後程式根據配置產生相應的方法。因為這些都被包進WCF中,所以使用者可以通過修改config 進行服務的設定。
在學習筆記 一中,我們實現了一個http協議下的C/S的結構的程式。
可以直接修改設定檔,來將其修改成一個tcp協議下的程式。
HostServer的app.config 修改如下: 1<?xml version="1.0" encoding="utf-8" ?>
2<configuration>
3 <system.serviceModel>
4 <services>
5 <service name="TESTWCF.MyData.MyDataService" behaviorConfiguration="serviceBehavior">
6 <!--<endpoint binding="basicHttpBinding" contract="TESTWCF.MyData.IMyDataService" address="MyData" />-->
7 <endpoint binding="netTcpBinding" contract="TESTWCF.MyData.IMyDataService" address="MyData" />
8
9 <!--<endpoint binding="mexHttpBinding" contract="IMetadataExchange" address="mex" />-->
10 <host>
11 <baseAddresses>
12 <!--<add baseAddress="http://localhost:8090"/>-->
13 <add baseAddress="net.tcp://localhost:8010"/>
14
15 </baseAddresses>
16 </host>
17 </service>
18 </services>
19
20 <behaviors>
21 <serviceBehaviors>
22 <behavior name="serviceBehavior">
23 <serviceMetadata httpGetEnabled="false" />
24 </behavior>
25 </serviceBehaviors>
26 </behaviors>
27 </system.serviceModel>
28</configuration>
這裡修改了binding的屬性,修改為netTcpBinding .並且修改baseAddresses中的協議的地址。
如果要修改別的方式,比如MSQ等,可以直接修改該檔案。
在WCF中支援9種邦定的方式,如下:
BasicHttpBinding: 用於把 WCF 服務當作 ASMX Web 服務。用於相容舊的Web ASMX 服務。
WSHttpBinding: 比 BasicHttpBinding 更加安全,通常用於 non-duplex 服務通訊。
WSDualHttpBinding: 和 WSHttpBinding 相比,它支援 duplex 類型的服務。
WSFederationHttpBinding: WS-Federation 安全通訊協議。
NetTcpBinding: 使用 TCP 協議,用於在區域網路(Intranet)內跨機器通訊。有幾個特點:可靠性、事務支援和安全,最佳化了 WCF 到 WCF 的通訊。限制是服務端和用戶端都必須使用 WCF 來實現。
NetNamedPipeBinding: 使用具名管道進行安全、可靠、高效的單機服務通訊方式。
NetMsmqBinding: 使用訊息佇列在不同機器間進行非串連通訊。
NetPeerTcpBinding: 使用 P2P 協議在多機器間通訊。
MsmqIntegrationBinding: 將 WCF 訊息轉化為 MSMQ 訊息,使用現有的訊息佇列系統進行跨機器通訊。如 MSMQ。
介面對應的協議及Encoding如下表:
如果要使HostServer同時支援Http。TCP的方式,可以直接上面中的注釋的部分開啟。
Client端app.config 修改以適應HostServer的修改。
app.config 修改後如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="net.tcp://localhost:8010/MyData" binding="netTcpBinding"
contract="TESTWCF.MyData.IMyDataService" />
<!--<endpoint address="http://localhost:8090/MyData" binding="basicHttpBinding"
contract="TESTWCF.MyData.IMyDataService" />-->
</client>
</system.serviceModel>
</configuration>
以上修改後,Client端變為使用tcp 的協議和HostServer互動。
以上修改均不需要修改code,既可實現。
另外,中午看過一遍文章,覺得在上一篇中,應該將MyData只定義介面的部分,而具體類可以定義在HostServer中,實現該介面,這樣做可以將介面部分定義為一個dll,可以供Client端使用,同時可以使具體的實現不能暴露出去。
當然Client已可以使用組建代理程式類的那種方法,但是覺得那樣很麻煩,直接使用定義好的介面給Client就好啊。
Client中使用ClientBase的類,繼承該類,實現不同的初始化函數可以使Client端更靈活的使用app.config中的定義。將在以後的學習中陸續記錄下各種的實現的方式。