Windows Communication Foundation (WCF) には、トランザクション フローを制御するための柔軟性の高いオプションが用意されています。 サービスのトランザクション フロー設定は、属性と構成の組み合わせを使用して表すことができます。
トランザクション フローの設定
トランザクション フロー設定は、次の 3 つの値が交差した結果として、サービス エンドポイントに対して生成されます。
サービス コントラクト内の各メソッドに指定された TransactionFlowAttribute 属性。
特定のバインドの
TransactionFlow
バインド プロパティ。特定のバインドの
TransactionFlowProtocol
バインド プロパティ。TransactionFlowProtocol
バインディング プロパティを使用すると、トランザクションのフローに使用できる 2 つの異なるトランザクション プロトコルから選択できます。 以降のセクションでは、それぞれについて簡単に説明します。
WS-AtomicTransaction プロトコル
WS-AtomicTransaction (WS-AT) プロトコルは、サードパーティのプロトコル スタックとの相互運用性が必要なシナリオに役立ちます。
OleTransactions プロトコル
OleTransactions プロトコルは、サードパーティのプロトコル スタックとの相互運用性が必要なく、WS-AT プロトコル サービスがローカルで無効になっているか、既存のネットワーク トポロジが WS-AT の使用を優先しないことをサービスの配置者が事前に認識しているシナリオに役立ちます。
次の表は、これらのさまざまな組み合わせを使用して生成できるさまざまな種類のトランザクション フローを示しています。
TransactionFlow 拘束 |
TransactionFlow バインディング プロパティ | TransactionFlowProtocol バインディング プロトコル | トランザクション フローの種類 |
---|---|---|---|
必須 | ほんとう | WS-AT | トランザクションは、相互運用可能な WS-AT 形式でフローする必要があります。 |
必須 | ほんとう | オレトランザクション | トランザクションは、WCF OleTransactions 形式でフローする必要があります。 |
必須 | 偽り | 適用なし | これは無効な構成であるため、適用されません。 |
許可 | ほんとう | WS-AT | トランザクションは、相互運用可能な WS-AT 形式でフローできます。 |
許可 | ほんとう | オレトランザクション | トランザクションは、WCF OleTransactions 形式でフローできます。 |
許可 | 偽り | 任意の値 | トランザクションはフローされません。 |
許可されていません | 任意の値 | 任意の値 | トランザクションはフローされません。 |
次の表は、メッセージ処理の結果をまとめたものです。
受信メッセージ | TransactionFlow の設定 | トランザクション ヘッダー | メッセージ処理の結果 |
---|---|---|---|
トランザクションが予想されるプロトコル形式と一致する | 許可または必須 |
MustUnderstand は true と等しくなります。 |
プロセス |
トランザクションが予期されるプロトコル形式と一致しない | 必須 |
MustUnderstand は false と等しくなります。 |
トランザクションが必要なため拒否されました |
トランザクションが予期されるプロトコル形式と一致しない | 許可 |
MustUnderstand は false と等しくなります。 |
ヘッダーが認識されないため拒否されました |
任意のプロトコル形式を使用したトランザクション | 許可されていません |
MustUnderstand は false と等しくなります。 |
ヘッダーが認識されないため拒否されました |
トランザクションなし | 必須 | なし | トランザクションが必要なため拒否されました |
トランザクションなし | 許可 | なし | プロセス |
トランザクションなし | 許可されていません | なし | プロセス |
コントラクト上の各メソッドは異なるトランザクション フロー要件を持つことができますが、トランザクション フロー プロトコルの設定はバインディングのレベルでスコープ設定されます。 つまり、同じエンドポイント (したがって同じバインディング) を共有するすべてのメソッドは、トランザクション フローを許可または要求する同じポリシーと、該当する場合は同じトランザクション プロトコルも共有します。
メソッド レベルでのトランザクション フローの有効化
トランザクション フローの要件は、サービス コントラクト内のすべてのメソッドで常に同じとは限りません。 そのため、WCF には、各メソッドのトランザクション フローの基本設定を表現できるようにする属性ベースのメカニズムも用意されています。 これは、サービス操作がトランザクション ヘッダーを受け入れるレベルを指定する TransactionFlowAttribute によって実現されます。 トランザクション フローを有効にする場合は、サービス コントラクト メソッドをこの属性でマークする必要があります。 この属性は、既定値がNotAllowedTransactionFlowOption列挙の値の 1 つを受け取ります。 NotAllowed以外の値が指定されている場合、メソッドは一方向である必要はありません。 開発者は、この属性を使用して、設計時にメソッド レベルのトランザクション フロー要件または制約を指定できます。
エンドポイント レベルでのトランザクション フローの有効化
WCF では、 TransactionFlowAttribute 属性が提供するメソッド レベルのトランザクション フロー設定に加えて、トランザクション フローに対してエンドポイント全体の設定が提供され、管理者はトランザクション フローを高いレベルで制御できます。
これは、エンドポイントのバインド設定で受信トランザクション フローを有効または無効にしたり、受信トランザクションに必要なトランザクション プロトコル形式を指定したりできる、 TransactionFlowBindingElementによって実現されます。
バインディングでトランザクション フローが無効になっているが、サービス コントラクトに対する操作の 1 つに受信トランザクションが必要な場合は、サービスの起動時に検証例外がスローされます。
WCF が提供するほとんどのスタンディング バインディングには、受信トランザクションを受け入れるように特定のバインディングを構成できるように、 transactionFlow
属性と transactionProtocol
属性が含まれています。 構成要素の設定の詳細については、「 <バインド>」を参照してください。
管理者または展開者は、エンドポイント レベルのトランザクション フローを使用して、構成ファイルを使用して、デプロイ時にトランザクション フローの要件または制約を構成できます。
安全
システムのセキュリティと整合性を確保するには、アプリケーション間でトランザクションをフローするときにメッセージ交換をセキュリティで保護する必要があります。 同じトランザクションに参加する権利がないアプリケーションに対して、トランザクションの詳細をフローまたは開示しないでください。
メタデータ交換を使用して不明または信頼されていない Web サービスに WCF クライアントを生成する場合、これらの 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 ヘッダーを指定することによって、トランザクション フローに影響します。 すべてのトランザクション ヘッダーは、true
と等しいMustUnderstand
でマークする必要があります。 それ以外の場合にマークされたヘッダーを含むメッセージは、SOAP エラーで拒否されます。
1 回の操作で存在できるトランザクション関連のポリシー アサーションは 1 つだけです。 操作に対して複数のトランザクション アサーションを持つポリシー ドキュメントは無効と見なされ、WCF によって拒否されます。 さらに、各ポートの種類内に存在できるトランザクション プロトコルは 1 つだけです。 1 つのポートの種類内で複数のトランザクション プロトコルを参照する操作を含むポリシー ドキュメントは無効と見なされ、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe) によって拒否されます。 出力メッセージまたは一方向の入力メッセージにトランザクション アサーションが存在するポリシー ドキュメントも無効と見なされます。