共用方式為


使用組態檔設定服務

使用組態檔來設定 Windows Communication Foundation (WCF) 服務可讓您在部署時 (而不是在設計階段) 彈性提供端點與服務行為資料。 本主題概要說明可用的主要技巧。

WCF 服務可使用 .NET Framework 組態技術來設定。 最常見的是,會將 XML 元素新增至裝載 WCF 服務的網際網路資訊服務 (IIS) 網站的 Web.config 檔案。 這些項目允許您變更詳細資料,例如各電腦的端點位址 (用於與服務通訊的實際位址)。 此外,WCF 還包含了一些系統提供的項目,方便您快速選取最基本的服務功能。 從 .NET Framework 4 開始,WCF 隨附可簡化 WCF 組態需求的新預設組態模型。 如果您沒有對特定服務提供任何 WCF 組態,執行階段會以一些標準端點和預設繫結/行為來設定服務。 事實上,撰寫組態是程式設計 WCF 應用程式的主要部分。

如需詳細資訊,請參閱設定服務的繫結。 如需最常用元素的清單,請參閱系統提供的繫結。 如需預設端點、繫結和行為的詳細資訊,請參閱簡化的組態WCF 服務的簡化組態

重要

部署並存案例時,如果部署了兩個不同的服務版本,您就必須指定組態檔所參考之組件的部分名稱。 這是因為組態檔會在所有服務版本之間共用,而且它們可能會在不同的 .NET Framework 版本底下執行。

System.Configuration:Web.config 和 App.config

WCF 使用 .NET Framework 的 System.Configuration 組態系統。

在 Visual Studio 中設定服務時,請使用 Web.config 檔或 App.config 檔來指定設定。 組態檔名稱的選擇取決於您為服務選擇的裝載環境。 如果您選擇使用 IIS 來裝載服務,請使用 Web.config 檔。 如果您使用其他任何裝載環境,請使用 App.config 檔。

在 Visual Studio 中,名為 App.config 的檔案是用來建立最後的組態檔。 最後實際使用的組態名稱取決於組件名稱。 例如,名為 "Cohowinery.exe" 的組件,其最後的組態檔名為 "Cohowinery.exe.config"。 但是,您只需要修改 App.config 檔案。 對該檔案進行的變更,會在編譯階段自動套用至最後的應用程式組態檔中。

在使用 App.config 檔案時,一旦應用程式啟動且套用了組態,組態系統會將 App.config 檔案與 Machine.config 檔案的內容合併。 這項機制可讓您透過 Machine.config 檔案來設定整部電腦。 App.config 檔案可以用來覆寫 Machine.config 檔案的設定,您也可以鎖定 Machine.config 檔案的設定以便加以取用。 在 Web.config 情況中,組態系統會將所有目錄乃至應用程式目錄中的 Web.config 檔案合併至已套用的組態。 如需組態與設定值優先權的詳細資訊,請參閱 System.Configuration 命名空間中的主題。

組態檔的主要區段

組態檔的主要區段包含下列項目。

<system.ServiceModel>

   <services>
   <!-- Define the service endpoints. This section is optional in the new
    default configuration model in .NET Framework 4. -->
      <service>
         <endpoint/>
      </service>
   </services>

   <bindings>
   <!-- Specify one or more of the system-provided binding elements,
    for example, <basicHttpBinding> -->
   <!-- Alternatively, <customBinding> elements. -->
      <binding>
      <!-- For example, a <BasicHttpBinding> element. -->
      </binding>
   </bindings>

   <behaviors>
   <!-- One or more of the system-provided or custom behavior elements. -->
      <behavior>
      <!-- For example, a <throttling> element. -->
      </behavior>
   </behaviors>

</system.ServiceModel>

注意

繫結和行為區段都是選用的,而且只會在必要時才納入。

<services> 項目

services 項目包含所有由應用程式裝載的服務規格。 從 .NET Framework 4 簡化的組態模型開始,本節為選擇性。

<services>

<service> 項目

每項服務都有下列屬性:

  • name. 指定用來提供服務合約實作的型別。 這是由命名空間、句號和型別名稱組成的完整名稱。 例如 "MyNameSpace.myServiceType"

  • behaviorConfiguration. 指定在 behavior 項目中找到的其中一個 behaviors 項目名稱。 指定的行為會掌管服務是否允許模擬之類的動作。 如果其值為空白名稱或未提供 behaviorConfiguration ,則會將一組預設的服務行為加入至服務。

  • <service>

<endpoint> 項目

每個端點都需要下列屬性代表的位址、繫結和合約:

  • address. 指定服務的統一資源識別元 (URI),此識別元可以是絕對位址,或是相對於服務基底位址的相對位址。 如果設為空字串,則代表在建立服務的 ServiceHost 時,指定的基底位址將有可用的端點。

  • binding. 一般來說,會指定系統提供的繫結,例如 WSHttpBinding,但是也可以指定使用者定義的繫結。 指定的繫結會決定使用的傳輸類型、安全性和編碼,以及是否支援或啟用可靠工作階段、交易或資料流處理。

  • bindingConfiguration. 如果必須修改預設的繫結值,可以藉由設定 binding 項目中的適當 bindings 項目來達成。 此屬性應該被賦予與用來變更預設值時所用的 name 項目的 binding 屬性相同的值。 如果未指定名稱或在繫結中未指定 bindingConfiguration ,則會將繫結型別的預設繫結用於端點。

  • contract. 指定可定義合約的介面。 這個介面是由 name 項目的 service 屬性所指定的 Common Language Runtime (CLR) 型別所實作。

  • <endpoint>

<bindings> 項目

bindings 項目包含所有繫結的規格,在任何服務中定義的任何端點都可以使用這些繫結。

<bindings>

<binding> 項目

binding 項目 (內含在 bindings 項目) 可以是其中一個系統提供繫結 (請參閱系統提供的繫結) 或是自訂繫結 (請參閱自訂繫結)。 binding 項目具有的 name 屬性可將繫結與 bindingConfiguration 項目的 endpoint 屬性所指定的端點相互關聯。 如果未指定名稱,則該繫結會對應於該繫結型別的預設值。

如需設定服務和用戶端的詳細資訊,請參閱設定 WCF 服務

<繫結>

<behaviors> 項目

這是定義服務行為之 behavior 項目的容器項目。

<behaviors>

<behavior> 項目

每個 behavior 項目都是由 name 屬性所識別,並可提供系統提供的行為,例如 <throttling>,或是自訂行為。 如果未指定名稱,則該行為項目會對應於預設服務或端點行為。

<behavior>

如何使用繫結與行為組態

WCF 可讓您輕易地透過組態的參考系統在端點之間共用組態。 與其直接指派組態值給端點,繫結相關的組態值會被分類到 bindingConfiguration 區段的 <binding> 項目群組中。 一個繫結組態是繫結上的一個具名的設定群組。 然後,端點可以依照名稱來參考 bindingConfiguration

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.serviceModel>
  <bindings>
    <basicHttpBinding>
     <binding name="myBindingConfiguration1" closeTimeout="00:01:00" />
     <binding name="myBindingConfiguration2" closeTimeout="00:02:00" />
     <binding closeTimeout="00:03:00" />  <!-- Default binding for basicHttpBinding -->
    </basicHttpBinding>
     </bindings>
     <services>
      <service name="MyNamespace.myServiceType">
       <endpoint
          address="myAddress" binding="basicHttpBinding"
          bindingConfiguration="myBindingConfiguration1"
          contract="MyContract"  />
       <endpoint
          address="myAddress2" binding="basicHttpBinding"
          bindingConfiguration="myBindingConfiguration2"
          contract="MyContract" />
       <endpoint
          address="myAddress3" binding="basicHttpBinding"
          contract="MyContract" />
       </service>
      </services>
    </system.serviceModel>
</configuration>

namebindingConfiguration 會在 <binding> 項目中設定。 name 必須是繫結型別範圍內的唯一字串,在此情況下為 <basicHttpBinding>,或為參考預設繫結的空值。 端點會將 bindingConfiguration 屬性設為此字串來連結至組態。

如下列範例所示, behaviorConfiguration 也是以同樣方式來實作。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="myBehavior">
           <callbackDebug includeExceptionDetailInFaults="true" />
         </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>

    </behaviors>
    <services>
     <service name="NewServiceType">
       <endpoint
          address="myAddress3" behaviorConfiguration="myBehavior"
          binding="basicHttpBinding"
          contract="MyContract" />
      </service>
    </services>
   </system.serviceModel>
</configuration>

請注意,預設的服務行為集合會加入至服務。 此系統允許端點共用組態,而不用重新定義設定。 如果需要整部電腦範圍,請在 Machine.config 中建立繫結或行為組態。所有 App.config 檔都提供組態設定。 Configuration Editor Tool (SvcConfigEditor.exe) 可讓您輕易地建立組態。

行為合併

當您想要以一致的方式使用一組通用行為時,行為合併功能可讓您輕鬆地管理行為。 這項功能可讓您以不同的組態階層層級指定行為,並且讓服務從多個組態階層層級繼承行為。 為了說明這項功能的運作方式,假設您在 IIS 中設有下列虛擬目錄配置:

~\Web.config~\Service.svc~\Child\Web.config~\Child\Service.svc

而且,您的 ~\Web.config 檔案具有下列內容:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

而且,您有一個位於 ~\Child\Web.config 的子系 Web.config,其中包含下列內容:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

位於 ~\Child\Service.svc 的服務會表現成同時具有 serviceDebug 和 serviceMetadata 行為。 位於 ~\Service.svc 的服務則只有 serviceDebug 行為。 結果是,系統會合併這兩個具有相同名稱的行為集合 (在本例中,名稱為空字串)。

您也可以使用 <clear> 標記來清除行為集合,而且可以使用 <remove> 標記來移除集合中的個別行為。 例如,下列兩個組態會產生只有 serviceMetadata 行為的子服務:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <remove name="serviceDebug"/>
          <serviceMetadata httpGetEnabled="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <clear/>
          <serviceMetadata httpGetEnabled="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

系統會針對沒有名稱的行為集合 (如上所示) 以及具名的行為集合進行行為合併。

行為合併適用於 IIS 裝載環境,其中 Web.config 檔案會以階層方式與根 Web.config 檔案和 machine.config 合併。不過,它也適用於應用程式環境,其中 machine.config 可以與 App.config 檔案合併。

行為合併會同時套用至組態中的端點行為和服務行為。

如果子行為集合包含已經存在父行為集合中的行為,子行為就會覆寫父代。 因此,如果父行為集合具有 <serviceMetadata httpGetEnabled="False" /> ,而且子行為集合具有 <serviceMetadata httpGetEnabled="True" />,子行為就會覆寫行為集合中的父行為,而且 httpGetEnabled 會是「true」。

另請參閱