ServiceModel 交易屬性
Windows Communication Foundation (WCF) 提供三個標準 System.ServiceModel 屬性 (Attribute) 的屬性 (Property),方便您設定 WCF 服務的交易行為:
TransactionFlowAttribute
TransactionFlowAttribute 屬性指定服務合約中的作業是否願意接受來自用戶端的傳入異動。 屬性 (Attribute) 使用下列屬性 (Property) 提供這項控制:異動使用 TransactionFlowOption 列舉以指定傳入異動是否為 Mandatory、Allowed 或 NotAllowed。
這是唯一將服務作業與外部用戶端互動產生關聯的屬性。 下列章節中描述的屬性與使用執行作業內的異動有關。
ServiceBehaviorAttribute
ServiceBehaviorAttribute 屬性指定服務合約實作的內部執行行為。 這個屬性 (Attribute) 的異動特定屬性 (Property) 包括:
TransactionAutoCompleteOnSessionClose 指定當工作階段關閉時是否會完成未完成的異動。 這個屬性的預設值為
false
。 如果這個屬性是true
,並且傳入工作階段依正常程序關閉,而不是因為網路或用戶端錯誤導致關閉,則任何未完成的異動都會成功完成。 否則,如果這個屬性是false
,或是如果工作階段不是依正常程序關閉,則當工作階段關閉時就會復原未完成的交易。 如果這個屬性是true
,則傳入通道必須是以工作階段為依據。ReleaseServiceInstanceOnTransactionComplete 指定當異動完成時是否要釋放基礎服務執行個體。 這個屬性的預設值為
true
。 下一個傳入訊息會導致建立新的基礎執行個體,並捨棄之前執行個體可能持有的任何每個異動狀態。 釋放服務執行個體是服務執行的內部動作,並且不會影響用戶端可能已建立的任何現有連線或工作階段。 這個功能等同於 COM+ 提供的 Just-in-Time 啟動功能。 如果屬性是true
,則 ConcurrencyMode 必須等於 Single。 否則,在啟動期間服務會發生無效組態驗證例外狀況。TransactionIsolationLevel 指定服務內異動所使用的隔離等級,這個屬性會使用其中一個 IsolationLevel 值。 如果本機隔離等級屬性不是 Unspecified,則傳入交易的隔離等級必須符合此本機屬性的設定。 否則,就會拒絕傳入異動並且將錯誤傳回用戶端。 如果 TransactionScopeRequired 是
true
,並且沒有流動的交易,這個屬性會判定在本機建立之交易要使用的 IsolationLevel 值。 如果 IsolationLevel 設定為 Unspecified,就會使用 IsolationLevelSerializable。TransactionTimeout 指定在服務所建立之新交易必須完成的時間間隔。 如果達到這個時間而異動尚未完成的話,異動就會中止。 TimeSpan 會用來當做將 TransactionScope 設定為 TransactionScopeRequired 之任何作業,以及建立新異動的
true
逾時。 從建立異動到完成兩階段異動認可通訊協定中的階段 1,所允許的逾時期間上限。 所使用的逾時值永遠都是 TransactionTimeout 屬性和transactionTimeout
組態設定之間較低的值。
OperationBehaviorAttribute
OperationBehaviorAttribute 屬性指定服務實作中方法的行為。 您可以用來表示作業的特定執行行為。 這個屬性 (Attribute) 的屬性 (Property) 不會影響服務合約的 Web 服務描述語言 (WSDL) 說明,而且只是可啟用常見功能的 WCF 程式設計模型元素 (否則程式設計人員必須自行實作該功能)。
這個屬性 (Attribute) 有下列異動特定屬性 (Property):
TransactionScopeRequired 指定方法是否必須在現用異動的範圍內執行。 預設值為
false
。 如果沒有為方法設定 OperationBehaviorAttribute 屬性,這也表示該方法不會在異動中執行。 如果作業不需要交易範圍,則存在於訊息標頭中的任何交易都不會啟動,而且保持為 IncomingMessageProperties 的 OperationContext 項目。 如果作業需要異動範圍,則異動來源會衍生自下列其中一個:如果交易從用戶端流入,則會在使用分散式交易建立的交易範圍內執行方法。
使用已佇列的傳輸時,會使用用來清除佇列訊息的異動。 請注意,使用的交易並不是流動交易,因為不是由訊息的原始傳送者提供。
自訂傳輸可以透過使用
TransportTransactionProperty
提供交易。如果上述都無法提供交易的外部來源,就會在呼叫方法之前立即建立新的 Transaction 執行個體。
TransactionAutoComplete 指定如果沒有發生未處理的例外狀況,方法執行的異動是否會自動完成。 如果這個屬性是
true
,當使用者方法在傳回時沒有發生例外狀況時,呼叫基礎結構會自動將異動標記為「已完成」。 如果這個屬性是false
,則異動會附加至執行個體,並且只有在用戶端呼叫使用這個屬性標記為true
的後續方法,或是如果後續方法明確地呼叫 SetTransactionComplete 時,才會標記為「已完成」。 除非 TransactionAutoCompleteOnSessionClose 屬性設定為true
,否則無法在從未標記為「已完成」的交易中執行這些結果,並且也不會認可其中包含的工作。 如果這個屬性設定為true
,您必須搭配工作階段使用通道,並且 InstanceContextMode 必須設定為 PerSession。