現代軟體系統離不開設定檔,WCF 透過 system.serviceModel 區段實現服務發布與用戶端連線的靈活配置。本文系統整理服務端與用戶端兩大配置體系。
<system.serviceModel>
<services>
<service name="..." behaviorConfiguration="...">
<endpoint address="" binding="..." bindingConfiguration="..." contract="..." />
</service>
</services>
<bindings> ... </bindings>
<behaviors> ... </behaviors>
</system.serviceModel>
service/@name:實作服務契約的完整型別名稱(含命名空間)service/@behaviorConfiguration:參考 <behaviors> 中的行為組態名稱<endpoint>:包含 ABC 三要素
address:相對/絕對位址,空值則用基底位址binding:繫結型別(如 netTcpBinding)bindingConfiguration:參考 <bindings> 中的具體設定contract:服務契約介面完整名稱範例:單一服務暴露兩個端點(業務 + 中繼資料)
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
<host> & <baseAddresses>當端點 address 為空時,使用基底位址:
<service ...>
<host>
<baseAddresses>
<add baseAddress="https://localhost/ServiceModelSamples/service.svc" />
</baseAddresses>
</host>
<endpoint ... />
</service>
上例中 ICalculator 位址 = https://.../service.svc,IMetadataExchange = https://.../service.svc/mex。
透過 <serviceBehaviors> 定義命名行為組態,再由 service/@behaviorConfiguration 參考。
常見行為:
<serviceMetadata httpGetEnabled="true" /><serviceBehavior> 內設 instanceContextMode(PerCall/PerSession/Single)concurrencyMode<behaviors>
<serviceBehaviors>
<behavior name="metadataSupport">
<serviceMetadata httpGetEnabled="true" httpGetUrl="" />
</behavior>
</serviceBehaviors>
</behaviors>
ServiceBehaviorAttribute / OperationBehaviorAttribute 雖可直接標註類別/方法,但寫入設定檔才符合「部署時調整、無需重編譯」的彈性原則。
用戶端核心為 <client> 區段定義端點,搭配 <bindings>、<behaviors>(如 endpointBehaviors),邏輯與服務端對稱。
httpGetEnabled 或限制存取configSource 外部化大型區段