簡化的組態
設定 Windows Communication Foundation (WCF) 服務可能是複雜的工作。 這項工作不但包含許多不同的選項,而且判斷需要哪些設定往往絕非易事。 雖然組態檔能夠增加 WCF 服務的靈活度,但是也會造成許多不易發現的問題。 .NET Framework 4.6.1 能夠解決這些問題,並且提供可降低服務設定大小與複雜度的方式。
簡化的組態
在 WCF 服務組態檔中,<system.serviceModel>
區段會針對每一項裝載的服務包含一個 <service>
元素。 <service>
元素包含 <endpoint>
元素的集合,這些元素可指定對每一項服務公開的端點,以及一組選擇性的服務行為。 <endpoint>
元素會指定端點公開的位址、繫結和合約,以及選擇性的繫結組態和端點行為。 <system.serviceModel>
區段還包含 <behaviors>
元素,可讓您指定服務或端點行為。 下列範例顯示組態檔的 <system.serviceModel>
區段。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name=MyBindingConfig"
maxBufferSize="100"
maxReceiveBufferSize="100" />
</basicHttpBinding>
</bindings> <services>
<service behaviorConfiguration="MyServiceBehavior"
name="MyService">
<endpoint address=""
binding="basicHttpBinding"
contract="ICalculator"
bindingConfiguration="MyBindingConfig" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
.NET Framework 4.6.1 藉由移除 <service>
元素的需求,讓設定 WCF 服務更容易。 如果您未新增 <service>
區段或在 <service>
區段中新增任何端點,而且您的服務並未以程式設計方式定義任何端點,則會自動將一組預設端點新增至服務,而且每個服務基底位址和服務實作的每個合約都會有一個端點。 每一個端點中的端點位置都會對應至基底位址,繫結是由基底位址配置所決定,而合約則是服務實作的合約。 如果您不需要指定任何端點或服務行為,或是進行任何繫結設定變更,就不需要指定服務組態檔。 如果服務實作兩個合約,而且主機同時啟用 HTTP 和 TCP 傳輸,服務主機就會建立四個預設端點,使用各個傳輸的每一個合約都會有一個端點。 若要建立預設端點,服務主機必須知道要使用哪些繫結。 這些設定指定於 <system.serviceModel>
區段內的 <protocolMappings>
區段中。 <protocolMappings>
區段包含傳輸通訊協定配置的清單,這些配置會對應至繫結型別。 服務主機會使用傳遞至主機本身的基底位址判斷要使用的繫結。 下列範例使用 <protocolMappings>
元素。
警告
變更預設組態項目 (例如繫結或行為) 可能會影響定義於組態階層架構中較低層級的服務,因為它們可能會使用這些預設繫結和行為。 因此,變更預設繫結和行為的所有人員都必須注意,這些變更可能會影響階層中的其他服務。
注意
Internet Information Services (IIS) 或 Windows 處理序啟用服務 (WAS) 底下裝載的服務會使用虛擬目錄做為其基底位址。
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" bindingConfiguration="MyBindingConfig"/>
<add scheme="net.tcp" binding="netTcpBinding"/>
<add scheme="net.pipe" binding="netNamedPipeBinding"/>
<add scheme="net.msmq" binding="netMSMQBinding"/>
</protocolMapping>
在上面的範例中,基底位址開頭為 "http" 配置的端點會使用 BasicHttpBinding。 基底位置開頭為 "net.tcp" 配置的端點則會使用 NetTcpBinding。 您可以覆寫本機 App.config 或 Web.config 檔中的設定。
<protocolMappings>
區段內的每一個元素都必須指定配置和繫結。 每個項目也可以選擇性地指定 bindingConfiguration
屬性,該屬性會指定組態檔之 <bindings>
區段內的繫結組態。 如果未指定 bindingConfiguration
,則會使用適當繫結型別的匿名繫結組態。
預設端點的服務行為會使用 <serviceBehaviors>
區段內的匿名 <behavior>
區段設定。 <serviceBehaviors>
內任何未命名的 <behavior>
元素都會用來設定服務行為。 例如,下列組態檔會啟用主機內所有服務的服務中繼資料發行。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors> <!-- No <service> tag is necessary. Default endpoints are added to the service -->
<!-- The service behavior with name="" is picked up by the service -->
</system.serviceModel>
端點行為是使用 <serviceBehaviors>
區段內的匿名 <behavior>
區段設定的。
下列範例的組態檔相當於本主題開頭的組態檔,使用的是簡化的組態模型。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding maxBufferSize="100"
maxReceiveBufferSize="100" />
</basicHttpBinding>
</bindings>
<!-- No <service> tag is necessary. Default endpoints will be added to the service -->
<!-- The service behavior with name="" will be picked up by the service -->
<protocolMapping>
<add scheme="http" binding="basicHttpBinding" />
</protocolMapping>
</system.serviceModel>
重要
此功能只涉及 WCF 服務組態,不是用戶端組態。 大多數時候,WCF 用戶端組態會以 svcutil.exe 之類的工具產生,或從 Visual Studio 新增服務參考。 如果您手動設定 WCF 用戶端,需要將 <client> 元素新增到組態中並指定您要呼叫的任何端點。