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