このセクションでは、SOAtest で .NET WCF のフローされたトランザクションを使用する方法を説明します。
このセクションの内容:
SOAtest と .NET WCF のフローされたトランザクション
SOAtest は WS-Atomic Transactions プロトコルおよび MS OLE Transactions プロトコルを使用して、フローされたトランザクションを開始できます。 フローされたトランザクションを使用できるのは、サービス エンドポイントのバインディング構成に transactionFlow="true" と、 transactionProtocol="OleTransactions" または transactionProtocol="WSAtomicTransactionOctober2004" のどちらかがある場合です。
Web サービスの操作コントラクトが TransactionFlow 属性とTransactionFlowOption.Allowed プロパティを使用している場合、SOAtestでトランザクションを有効化するかどうかは任意であり、追加の構成は必須ではありません。
しかし、Web サービスの操作コントラクトが TransactionFlowOption.Mandatory プロパティを使用している場合、トランザクションが必要であり、テスト スイートはトランザクションを開始するよう構成されている必要があります。WCF のフローされたトランザクションに関する一般的な情報については、以下を参照してください。
- WS トランザクション フロー: http://msdn.microsoft.com/en-us/library/ms752261.aspx
TransactionFlowAttribute: http://msdn.microsoft.com/en-us/library/system.servicemodel.transactionflowattribute.aspx
TransactionFlowOption: http://msdn.microsoft.com/en-us/library/system.servicemodel.transactionflowoption.aspx
上記の MSDN の「WS トランザクション フロー」では、フローされたトランザクションを開始するよう Web サービス クライアントを構成するために必要な条件が説明されています。SOAtest でトランザクションを構成するのに必要な手順も、この項目の説明と似ています。まず、WCF のトランザクションの背景となる基本的なコンセプトを理解するため、「WS トランザクション フロー」を読むことを強く推奨します。
MSDTC の構成
SOAtestを実行するマシンおよび Web サービスをホストするマシンで Microsoft Distributed Transaction Coordinator (MSDTC) を正しく構成する必要があります。MSDN の 「WS トランザクション フロー」に、MSDTC の構成手順および Windows のファイアウォールで DTC を許可する方法が記載されています。その他、MSDTC の構成に役立つ可能性のある項目として、以下が挙げられます。
- Windows Server 2003 でネットワーク DTC アクセスを有効にする方法: http://support.microsoft.com/kb/817064/en-us
- MS DTC ファイアウォールの問題をトラブルシューティングする方法: http://support.microsoft.com/kb/306843/en-us
テストスイートの構成
複数の Web サービスの操作を 1 つのトランザクション スコープ内で呼び出すには、TransactionScope オブジェクトを構成する必要があります。次の C# のコードを例とします。
CalculatorClient client = new CalculatorClient("transactionEnabledEndpoint");using (TransactionScope tx = new TransactionScope(TransactionScopeOption.Required)) { client.add(1, 2); client.add(2, 3); tx.Complete(); } client.Close();
SOAtestでは、上記のコードに相当するテスト スイートは、次のようになります。
- Extension Tool 1: トランザクション スコープの作成
- XML Data Bank: プロパゲーション トークン
- Tool 1: add(1,2)
- Tool 2: add(2,3)
- Extension Tool 2: トランザクションの終了
上記のテスト スイートでは、TransactionScope オブジェクトを作成し、現在のトランザクションのプロパゲーション トークンを取得するために Extension Tool 1 が必要になります。プロパゲーション トークンは、後にツールで使用する必要があるため (後述)、XML Data Bank に保存されます。次の Jython コードは、Extension Tool 1 として使用できるサンプルです。
from webtool.soap.wcf import *; from soaptest.api import *; def createTransaction(input, context): id = WcfUtil.createTransactionScope(WcfUtil.TRANSACTION_SCOPE_OPTION_REQUIRED, WcfUtil.ISOLATION_LEVEL_SERIALIZABLE, 60000) context.put("MY_TRANSACTION_ID", id) token = WcfUtil.getCurrentPropagationToken() return SOAPUtil.getXMLFromString([token])
テスト スイートの Extension Tool 2 は、トランザクションを終了するために使用されます。この Extension ツールは、C# コード サンプルの tx.Complete() に相当する処理を行っています。次の Jython コードは Extension Tool 2 のサンプルです。
from webtool.soap.wcf import *; def endTransaction(input, context): id = context.get("MY_TRANSACTION_ID") WcfUtil.completeTransactionScope(id)
WcfUtil および対応する .NET API については以下で説明します。
int webtool.soap.wcf.WcfUtil.createTransactionScope(int scopeOption, int isolationLevel, int scopeTimeout)
パラメーター
scopeOption
参照: TransactionScopeOption 列挙体: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx
以下のいずれかを使用できます:
- WcfUtil.TRANSACTION_SCOPE_OPTION_REQUIRED
- WcfUtil.TRANSACTION_SCOPE_OPTION_REQUIRES_NEW
- WcfUtil.TRANSACTION_SCOPE_OPTION_SUPPRESS
isolationLevel
参照: IsolationLevel 列挙体: http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel.aspx
以下のいずれかを使用できます:
- WcfUtil.ISOLATION_LEVEL_SERIALIZABLE
- WcfUtil.ISOLATION_LEVEL_REPEATABLE_READ
- WcfUtil.ISOLATION_LEVEL_READ_COMMITTED
- WcfUtil.ISOLATION_LEVEL_READ_UNCOMMITTED
- WcfUtil.ISOLATION_LEVEL_SNAPSHOT
- WcfUtil.ISOLATION_LEVEL_CHAOS
- WcfUtil.ISOLATION_LEVEL_UNSPECIFIED
scopeTimeout
- TransactionScope のタイムアウト時間 (単位: ミリ秒) です。
戻り値
TransactionScope の参照に使用できる ID です。
String WcfUtil.getCurrentPropagationToken()
戻り値
Base64 エンコーディングされた現在のトランザクションのプロパゲーション トークンです。
WcfUtil.completeTransactionScope(int transactionScopeRef)
パラメーター
transactionScopeRef
- WcfUtil.createTransactionScope() から返される ID です。
トランザクション ヘッダーの構成
各ツールには、プロパゲーション トークンを含む SOAP ヘッダーが必要です。このプロパゲーション トークンは、前に説明した最初の Extension Tool テストに連結された XML Data Bank から取得されます。必要な SOAP ヘッダーのタイプは、トランザクション プロトコルによって異なります。
OleTransaction ヘッダー
OleTransaction の場合、OleTxTransaction SOAP ヘッダーが必要です。 参考までに、次に OleTxTransaction SOAP ヘッダーのサンプルを示します。
<OleTxTransaction b:Expires="59904" s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2006/02/tx/oletx" xmlns:b="http://schemas.xmlsoap.org/ws/2004/10/wscoor" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> <PropagationToken></PropagationToken> </OleTxTransaction>
上記のヘッダーをツール 1 に追加するには、次の操作を行います。
- ツールの [リクエスト] タブで [SOAP ヘッダー] タブを選択します。
- [SOAP ヘッダー] タブで [追加] ボタンをクリックします。[新規 SOAP ヘッダーの追加] ダイアログが表示されます。
- [新規 SOAP ヘッダーの追加] ダイアログで [カスタム] を選択し、[OK] ボタンをクリックします。[SOAP ヘッダー] タブに新しい行が追加されます。
- [SOAP ヘッダー] タブで新しい行をダブルクリックします。[編集] ダイアログが表示されます。
次のサンプル SOAP ヘッダーを [編集] ダイアログのリテラル/XML テキスト フィールドに貼り付けます。
<OleTxTransaction b:Expires="59904" s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2006/02/tx/oletx" xmlns:b="http://schemas.xmlsoap.org/ws/2004/10/wscoor" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> <PropagationToken></PropagationToken> </OleTxTransaction>
- [編集]ダイアログの [ビュー] ドロップ ダウンから [フォーム XML] を選択し、[はい] をクリックしてリテラル XML 値でフォーム XML の値を上書きます。
- フォーム XML ビューで PropagationToken 要素を選択し、要素値に対して [パラメータライズ] オプションを選択します。これによって、プロパゲーション トークンを格納した XML Data Bank を選択できるようになります。
- [OK] ボタンをクリックします。
WS-Atomic Transaction ヘッダー
WS-Atomic Transaction の場合は、CoordinationContext SOAP ヘッダーが必要です。OleTxTransaction ヘッダーの場合と同様に、PropagationToken 要素をパラメータライズして XML Data Bank のプロパゲーション トークンを含める必要があります。参考までに、次に CoordinationContext SOAP ヘッダーのサンプルを示します。
<CoordinationContext s:mustUnderstand="1" xmlns="http://schemas.xmlsoap.org/ws/2004/10/wscoor" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:mstx="http://schemas.microsoft.com/ws/2006/02/transactions" xmlns:s="http://www.w3.org/2003/05/soap-envelope"> <wscoor:Identifier xmlns:wscoor="http://schemas.xmlsoap.org/ws/2004/10/wscoor"></wscoor:Identifier> <Expires>59904</Expires> <CoordinationType>http://schemas.xmlsoap.org/ws/2004/10/wsat</CoordinationType> <RegistrationService> <Address xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing">https://hostname/WsatService/Registration/Coordinator/Disabled/</Address> <ReferenceParameters xmlns="http://schemas.xmlsoap.org/ws/2004/08/addressing"> <mstx:RegisterInfo> <mstx:LocalTransactionId></mstx:LocalTransactionId> </mstx:RegisterInfo> </ReferenceParameters> </RegistrationService> <mstx:IsolationLevel>0</mstx:IsolationLevel> <mstx:LocalTransactionId></mstx:LocalTransactionId> <PropagationToken xmlns="http://schemas.microsoft.com/ws/2006/02/tx/oletx"></PropagationToken> </CoordinationContext>
上記のヘッダーをツール 2 に追加するには、ツール 1 で概略を示したのと同じ手順を行い、[編集] ダイアログで上記の CoordinationContext SOAP ヘッダーを貼り付けます。