Windows Communication Foundation (WCF) 提供高度彈性的選項來控制交易流程。 服務的交易流程設定可以使用屬性和組態的組合來表示。
交易流程設定
由於下列三個值的交集,會產生服務端點的交易流程設定:
TransactionFlowAttribute服務合約中每個方法所指定的屬性。
特定
TransactionFlow系結中的系結屬性。特定
TransactionFlowProtocol系結中的系結屬性。 繫結屬性可讓您在兩種可用來傳遞交易的不同交易通訊協議中進行選擇。 下列各節簡短說明每一節。
WS-AtomicTransaction 通訊協定
當需要與第三方通訊協定堆疊的互作性時,WS-AtomicTransaction (WS-AT) 通訊協定適用於案例。
OleTransactions 通訊協定
OleTransactions 通訊協定適用於不需要與第三方通訊協定堆疊進行互操作的情況,而且服務部署者事先知道本地已停用 WS-AT 通訊協定服務,或現有的網路拓撲不適合使用 WS-AT。
下表顯示可使用這些各種組合產生的不同類型的交易流程。
| TransactionFlow 綁定 |
TransactionFlow 系結屬性 | TransactionFlowProtocol 系結通訊協定 | 交易流程的類型 |
|---|---|---|---|
| 強制的 | 是 | WS-AT | 交易必須以互通 WS-AT 格式流動。 |
| 強制的 | 是 | OleTransactions | 交易必須以 WCF OleTransactions 格式流動。 |
| 強制的 | 假的 | 不適用 | 不適用,因為這是無效的組態。 |
| 允許 | 是 | WS-AT | 交易可能會以可互通 WS-AT 格式流動。 |
| 允許 | 是 | OleTransactions | 交易可能會以 WCF OleTransactions 格式流動。 |
| 允許 | 假的 | 任何值 | 交易不會流動。 |
| 不允許 | 任何值 | 任何值 | 交易不會流動。 |
下表摘要說明訊息處理結果。
| 傳入訊息 | TransactionFlow 設定 | 交易標頭 | 訊息處理結果 |
|---|---|---|---|
| 交易符合預期的通訊協定格式 | 允許或強制 |
MustUnderstand 等於 true. |
流程 |
| 交易不符合預期的通訊協定格式 | 強制的 |
MustUnderstand 等於 false. |
因為需要交易而遭到拒絕 |
| 交易不符合預期的通訊協定格式 | 允許 |
MustUnderstand 等於 false. |
拒絕,因為無法理解標題 |
| 使用任何通訊協定格式的交易 | 不允許 |
MustUnderstand 等於 false. |
拒絕,因為無法理解標題 |
| 無交易 | 強制的 | N/A | 因為需要交易而遭到拒絕 |
| 無交易 | 允許 | N/A | 流程 |
| 無交易 | 不允許 | N/A | 流程 |
雖然合約上的每個方法可以有不同的交易流程需求,但交易流程通訊協定設定的範圍在系結的層級。 這表示所有共用相同端點的方法(因此相同的系結)也會共用允許或要求交易流程的相同原則,以及適用時相同的交易通訊協定。
在方法層面啟用交易流程
服務合約中所有方法的交易流程需求不一定相同。 因此,WCF 也提供屬性型機制,以允許表示每個方法的交易流程喜好設定。 這是透過TransactionFlowAttribute來指定服務操作接受交易標頭的層級,從而實現。 如果您想要啟用交易流程,您應該使用此屬性來標記服務合約方法。 這個屬性會採用列舉的 TransactionFlowOption 其中一個值,其中預設值為 NotAllowed。 如果指定了以外的 NotAllowed 任何值,則方法必須是非單向方法。 開發人員可以使用此屬性在設計階段指定方法層級的交易流程需求或限制。
在端點層級啟用交易流程
除了 屬性提供的方法層級交易流程設定 TransactionFlowAttribute 之外,WCF 還提供整個端點的交易流程設定,以允許系統管理員控制較高層級的交易流程。
這可透過 TransactionFlowBindingElement,讓您在端點的系結設定中啟用或停用傳入交易流程,以及指定傳入交易所需的交易通訊協定格式。
如果系結已停用交易流程,但服務合約上的其中一項作業需要傳入交易,則在服務啟動時會拋出驗證例外狀況。
WCF 提供的大多數常設系結都包含 transactionFlow 和 transactionProtocol 屬性,可讓您設定特定系結以接受傳入交易。 如需設定組態元素的詳細資訊,請參閱 <繫結>。
系統管理員或部署者可以使用端點層級交易流程,在部署階段使用組態檔來設定交易流程需求或條件約束。
安全
為了確保系統安全性和完整性,您必須在應用程式之間流動交易時保護訊息交換。 您不應將交易詳細數據流向任何無權參與相同交易的應用程式。
透過元數據交換將 WCF 用戶端產生至未知或不受信任的 Web 服務時,這些 Web 服務的呼叫應該盡可能隱藏目前的交易。 下列範例示範如何執行這項操作。
//client code which has an ambient transaction
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
{
// No transaction will flow to this operation
untrustedProxy.Operation1(...);
scope.Complete();
}
//remainder of client code
此外,服務應設定為只接受已驗證和授權客戶端的傳入交易。 只有在傳入交易來自高度信任的用戶端時,才應該接受這些交易。
政策聲明
WCF 會使用政策聲明來控制交易流程。 您可以在服務的政策文件中找到政策聲明,它是由合約、配置和屬性的匯總所產生。 用戶端可以使用 HTTP GET 或 WS-MetadataExchange 要求-回復來取得服務的原則檔。 客戶端接著可以處理原則檔,以判斷服務合約上的哪些作業可能支援或需要交易流程。
交易流程政策斷言會藉由指定客戶端應該傳送至服務的 SOAP 標頭來表示交易,以影響交易流程。 所有交易標頭都必須標示 MustUnderstand 為等於 true。 任何標頭被標示為不一致的訊息都會因為SOAP錯誤而遭到拒絕。
單一操作上只能有一個交易相關的政策聲明。 在操作上有多個交易聲明的這些原則檔會被視為無效,並由 WCF 拒絕接受。 此外,每個埠類型內只能有單一交易通訊協定。 政策文件中的操作若在單一埠類型內參考多個交易協定,則被視為無效,並被ServiceModel 元數據公用程式工具(Svcutil.exe)拒絕。 輸出訊息或單向輸入訊息上存在交易判斷提示的原則檔也被視為無效。