2

トランザクションの一部として呼び出されているWCFサービスがあります。

サービスが2回呼び出された場合(デバッグ中に発生することが多い)、サービスによってFaultExceptionがスローされるようにしたいのですが、トランザクション全体が成功する必要があります。

 throw new FaultException("Duplicate action not allowed for " + 
                          msgIn.ActionType, new FaultCode("DUPE_ACTION"));

FaultExceptionをスローしているので、トランザクションは中止に投票しますか?

私はこれを行うことを検討しています(トランザクションを完了に設定し、次に障害をスローします)-しかし、それが機能するかどうかさえわかりません。それはまた私が心配する必要がないいくつかの合併症を持っています。

[OperationBehavior(TransactionScopeRequired = true,
                   TransactionAutoComplete = false)]
public void MyMethod(...)
{
   try
   {
      OperationContext.Current.SetTransactionComplete( );
      throw new FaultException("Duplicate action not allowed for " + 
                          msgIn.ActionType, new FaultCode("DUPE_ACTION"));
   }
   catch
   {
      /* Do some error handling then */
      throw;
   }
}

明らかな解決策は、パラメータを使用してメッセージを返すことですSuccess(これは私が最初に行ったことです)が、最終的には障害であり、例外が発生するに値するため、これは悪い設計です。

または、クライアントに障害をキャッチしてトランザクションを続行させるのと同じくらい簡単な解決策です。すでに投票が行われているのではないかと心配しています。

WCFサービスに障害をスローさせながら、トランザクションを成功させるための最良の方法は何ですか?

4

1 に答える 1

1

WCFサービスへの呼び出しを、[トランザクションスコープ]オプションの[抑制]を使用してトランザクションスコープでラップすることを試みることができます(これは、使用しているもののサブトランザクションスコープです)。これにより、コードのこの部分からの例外がアンビエントトランザクションに影響を与えるのを防ぎます。内部/サブトランザクションスコープを終了する前に例外を処理する限り、問題はありません。

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx

于 2010-01-03T19:41:50.177 に答える