當今的軟件系統(tǒng)開發(fā),如果沒有配置文件幾乎是不可想象的事。沒有配置文件,軟件如何按照用戶的要求對功能進行定制?沒有配置文件,在對軟件進行配置安裝的時候如何根據(jù)具體的硬軟件環(huán)境進行修改?最重要的是沒有配置文件,該如何應對軟件系統(tǒng)的可擴展要求?不知不覺地,配置文件的編寫與管理竟然成了軟件開發(fā)的重中之重。
WCF作為分布式開發(fā)的基礎框架,在定義服務以及定義消費服務的客戶端時,都使用了配置文件的方法。雖然WCF也提供硬編程的方式,通過在代碼中直接設置相關對象的屬性來完成服務端與客戶端的配置,然而這種方式并不利于后期的更改。無疑,配置文件為WCF帶來了軟件開發(fā)的靈活性,它的使用也是WCF開發(fā)過程中最頻繁的。
WCF的配置文件共分為兩部分:服務端配置與客戶端配置。兩者由于功能的不同,在配置文件的使用上也略有不同。
1.WCF的服務端配置
服務端的配置文件主要包括endpoint、binding、behavior的配置。一個標準的服務端配置文件所包含的主要xml配置節(jié)如下所示:
<system.ServiceModel>
<services>
<service>
<endpoint/>
</service>
</services>
<bindings>
<!—定義一個或多個系統(tǒng)提供的binding元素,例如<basicHttpBinding> -->
<!—也可以是自定義的binding元素,如<customBinding>. -->
<binding>
<!—例如<BasicHttpBinding>元素. -->
</binding>
</bindings>
<behaviors>
<!—一個或多個系統(tǒng)提供的behavior元素. -->
<behavior>
<!—例如<throttling>元素. -->
</behavior>
</behaviors>
</system.ServiceModel>
1.1 <services>配置節(jié)
在<services>配置節(jié)中可以定義多個服務,每一個服務都被放到<service>配置節(jié)中,WCF的宿主程序可以通過配置文件找到這些定義的服務并發(fā)布這些服務。
<service>配置節(jié)包含name和behaviorConfiguration屬性。其中,name配置了實現(xiàn)Service Contract的類型名。類型名必須是完整地包含了命名空間和類型名。而behaviorConfiguration的配置值則與其后的<behaviors>配置節(jié)的內容有關。<endpoint>是<service>配置節(jié)的主體,其中,<endpoint>配置節(jié)包含了endpoint的三個組成部分:Address、Binding和Contract。由于具體的binding配置是在<bindings>配置節(jié)中完成,因而,在<endpoint>中配置了bindingConfiguration屬性,指向具體的binding配置。如下所示:
<services>
<service name="BruceZhang.MyService" behaviorConfiguration="MyBehavior">
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="DuplexBinding"
contract="BruceZhang.IHello" />
</service>
</services>
我們也可以定義多個endpoint,例如:
<services>
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="mexHttpBinding"
contract=" Microsoft.ServiceModel.Samples.IMetadataExchange" />
</service>
</services>
如果address值為空,那么endpoint的地址就是默認的基地址(Base Address)。例如ICalculator服務的地址就是http://localhost/servicemodelsamples/service.svc,而IMetadataExchange服務的地址則為http://localhost/servicemodelsamples/service.svc/mex。這里所謂的基地址可以在<service>中通過配置<host>來定義:
<service
name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<host>
<baseAddresses>
<add baseAddress=
"http://localhost/ServiceModelSamples/service.svc"/>
</baseAddresses>
</host>
<endpoint … />
</service>
1.2 <behaviors>配置節(jié)
當我們在定義一個實現(xiàn)了Service Contract的類時, binding和address信息是客戶端必須知道的,否則無法調用該服務。然而,如果需要指定服務在執(zhí)行方面的相關特性時,就必須定義服務的behavior。在WCF中,定義behavior就可以設置服務的運行時屬性,甚至于通過自定義behavior插入一些自定義類型。例如通過指定ServiceMetadataBehavior,可以使WCF服務對外公布Metadata。配置如下:
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
<serviceBehaviors>
<behaviors>
在WCF中,behavior被定義為Attribute,其中,System.ServiceModel.ServiceBehaviorAttribute和System.ServiceModel.OperationBehaviorAttribute是最常用的behavior。雖然,behavior作為Attribute可以通過編程的方式直接施加到服務上,但出于靈活性的考慮,將behavior定義到配置文件中才是最好的設計方式。
利用ServiceBehavior與OperationBehavior可以控制服務的如下屬性:
1、 對象實例的生命周期;
2、 并發(fā)與異步處理;
3、 配置行為;
4、 事務行為;
5、 序列化行為;
6、 元數(shù)據(jù)轉換;
7、 會話的生命周期;
8、 地址過濾以及消息頭的處理;
9、 模擬(Impersonation);
例如,通過ServiceBehavior設置對象實例的生命周期:
<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<instanceContextMode httpGetEnabled="true" httpGetUrl=""/>
</behavior>
<serviceBehaviors>
<behaviors>