共用方式為


指定服務執行階段行為

一旦您設計好服務合約 (設計服務合約) 並實作了服務合約 (實作服務合約),就可以設定服務執行階段的作業行為。本主題討論系統提供的服務與作業行為,並說明哪裡可以找到更多資訊以建立新行為。儘管有些行為會以屬性形式來套用,許多行為還是需要透過應用程式組態檔或以程式設計方式來套用。如需詳細資訊設定您的服務應用程式的詳細資訊,請參閱設定服務

概觀

合約會定義輸入、輸出、資料型別,以及該類型服務的功能。實作服務合約會建立一個類別,此類別在使用位址上的繫結進行設定時會實行類別所實作的合約。合約、繫結和位址資訊皆為用戶端所熟知,若缺乏這些資訊,用戶端就無法使用服務。

但是,用戶端並不清楚執行緒問題或執行個體管理之類的作業細節。一旦您實作了服務合約,就可以透過「行為」(Behavior) 來設定大量的作業特性。行為是一種物件,可以藉由設定執行階段屬性或將自訂型別插入執行階段來修改 Windows Communication Foundation (WCF) 執行階段。如需詳細資訊藉由建立使用者定義行為來修改執行階段的詳細資訊,請參閱擴充 ServiceHost 與服務模型層

System.ServiceModel.ServiceBehaviorAttributeSystem.ServiceModel.OperationBehaviorAttribute 屬性都是常用的行為,且會公開最常要求的作業功能。由於它們是屬性,您可以將它們套用至服務或作業實作中。儘管您能以程式設計方式來使用諸如 System.ServiceModel.Description.ServiceMetadataBehaviorSystem.ServiceModel.Description.ServiceDebugBehavior 的其他行為,一般來說您還是需要透過應用程式組態檔來加以套用。

本主題提供 ServiceBehaviorAttributeOperationBehaviorAttribute 屬性的概觀、說明行為可以進行作業的各種範圍,並針對 WCF 開發人員可能感興趣的許多系統提供行為提供各種範圍的簡要說明。

ServiceBehaviorAttribute 和 OperationBehaviorAttribute

最重要的行為是 ServiceBehaviorAttributeOperationBehaviorAttribute 屬性,可供您用來控制:

  • 執行個體存留期

  • 並行與同步化支援

  • 組態行為

  • 交易行為

  • 序列化行為

  • 中繼資料轉換

  • 工作階段存留期

  • 位址篩選與標頭處理

  • 模擬

  • 若要使用這些屬性,請以適用該範圍的屬性 (Attribute) 來標記服務或作業實作,然後設定屬性 (Property)。例如,下列程式碼範例說明的作業實作會透過 System.ServiceModel.OperationBehaviorAttribute.Impersonation 屬性要求此作業的呼叫端支援模擬。

Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Name:="SampleHello", Namespace:="http://microsoft.wcf.documentation")> _
  Public Interface IHello
    <OperationContract> _
    Function Hello(ByVal greeting As String) As String
  End Interface

  Public Class HelloService
      Implements IHello

    Public Sub New()
      Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
    End Sub

    Protected Overrides Sub Finalize()
      Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
    End Sub

    <OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
    Public Function Hello(ByVal greeting As String) As String Implements IHello.Hello
      Console.WriteLine("Called by: " & Thread.CurrentPrincipal.Identity.Name)
      Console.WriteLine("IsAuthenticated: " & Thread.CurrentPrincipal.Identity.IsAuthenticated.ToString())
      Console.WriteLine("AuthenticationType: " & Thread.CurrentPrincipal.Identity.AuthenticationType.ToString())

      Console.WriteLine("Caller sent: " & greeting)
      Console.WriteLine("Sending back: Hi, " & Thread.CurrentPrincipal.Identity.Name)
      Return "Hi, " & Thread.CurrentPrincipal.Identity.Name
    End Function
  End Class
End Namespace

許多屬性都要求來自繫結的額外支援。例如,要求來自用戶端之交易的作業必須設為使用可支援流動交易的繫結。

已知的單一服務

您可以使用 ServiceBehaviorAttributeOperationBehaviorAttribute 屬性控制特定存留期,存留期可以分別屬於實作作業的 InstanceContext 和服務物件。

例如,System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode 屬性會控制多久釋放一次 InstanceContext,而 System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceModeSystem.ServiceModel.ServiceBehaviorAttribute.ReleaseServiceInstanceOnTransactionComplete 屬性則控制釋放服務物件的時機。

但是,您也可以自行建立服務物件,並透過該物件來建立服務主機。若要這麼做,您必須同時將 System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode 屬性設定為 Single,否則在開啟服務主機時會擲回例外狀況。

請使用 System.ServiceModel.ServiceHost.#ctor(System.Object,System.Uri[]) 建構函式建立此類服務。當您想要將特定物件執行個體提供給單一服務使用時,它提供了另一種實作自訂 System.ServiceModel.Dispatcher.IInstanceContextInitializer 的方式。當服務實作型別很難建構時 (例如,無法實作沒有參數的預設公用建構函式時),您可以使用這個多載。

請注意,提供物件給這個建構函式時,某些與 Windows Communication Foundation (WCF) 執行個體行為相關的功能會以不同的方式運作。例如,提供已知物件執行個體時,呼叫 System.ServiceModel.InstanceContext.ReleaseServiceInstance 將沒有任何作用。同樣的,也會忽略任何其他執行個體的釋放機制。ServiceHost 類別的行為就像是所有作業的 System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode 屬性都已設為 System.ServiceModel.ReleaseInstanceMode.None

其他服務、端點、合約與作業行為

服務行為,例如 ServiceBehaviorAttribute 屬性,會在整個服務上作業。例如,如果您將 System.ServiceModel.ServiceBehaviorAttribute.ConcurrencyMode 屬性設為 System.ServiceModel.ConcurrencyMode.Multiple,就必須自行處理該服務中每項作業的執行緒同步化問題。端點行為會在整個端點上作業;許多系統提供的端點行為都是因應用戶端功能而生。合約行為會在合約層級作業,而作業行為則會修改作業遞送。

這些行為當中,有許多都是在屬性上實作的,而您能以使用 ServiceBehaviorAttributeOperationBehaviorAttribute 屬性的方式來使用它們,方法是將它們套用至適當的服務類別或作業實作上。儘管您能以程式設計方式來使用諸如 ServiceMetadataBehaviorServiceDebugBehavior 物件的其他行為,一般來說您還是需要透過應用程式組態檔來加以套用。

例如,您可以透過 ServiceMetadataBehavior 物件來設定中繼資料的發行。下列應用程式組態檔說明最常見的用法。

<configuration>
  <system.serviceModel>
    <services>
      <service 
        name="Microsoft.WCF.Documentation.SampleService"
        behaviorConfiguration="metadataSupport"
      >
        <host>
          <baseAddresses>
            <add baseAddress="https://localhost:8080/SampleService" />
          </baseAddresses>
        </host>
        <endpoint
          address=""
          binding="wsHttpBinding"
          contract="Microsoft.WCF.Documentation.ISampleService"
        />
        <!-- Adds a WS-MetadataExchange endpoint at -->
        <!-- "https://localhost:8080/SampleService/mex" -->
        <endpoint
           address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
      <behavior name="metadataSupport">
        <!-- Enables the IMetadataExchange endpoint in services that -->
        <!-- use "metadataSupport" in their behaviorConfiguration attribute. -->
        <!-- In addition, the httpGetEnabled and httpGetUrl attributes publish -->
        <!-- Service metadata for retrieval by HTTP/GET at the address -->
        <!-- "https://localhost:8080/SampleService?wsdl" -->
        <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  </system.serviceModel>
</configuration>

下列章節說明最好用的系統提供行為,供您用來修改服務或用戶端的執行階段遞送。請參閱參考主題來判斷如何使用每一個項目。

服務行為

下列行為可在服務上作業。

端點行為

下列行為可在端點上作業。這類行為大多可用於用戶端應用程式中。

合約行為

DeliveryRequirementsAttribute. 指定繫結必須提供給服務或用戶端實作的功能需求。

作業行為

下列作業行為指定作業的序列化與交易控制。

另請參閱

工作

HOW TO:控制服務執行個體

其他資源

設定服務