2


0

トランザクション全体を中止せずにWCFでFaultExceptionを処理する方法は?

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

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

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

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

私はこれを行うことを検討しています(トランザクションを完了してから障害をスローします)-しかし、それがうまくいくかどうかもわかりません。 また、http://codeidol.com/csharp/wcf/Transactions/Transactional-Service-Programming/ [複雑な問題]もありますが、心配する必要はありません。

[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サービスがエラーをスローすることを許可し、それでもトランザクションを成功させる最良の方法は何ですか?

1 Answer


1


トランザクションスコープオプションSupressを使用して、トランザクションスコープでWCFサービスの呼び出しをラップしてみてください(これは、所有しているサブスコープのサブトランザクションスコープです)。 これにより、コードのこの部分からの例外がアンビエントトランザクションに影響を与えなくなります。 inner / subトランザクションスコープを終了する前に例外を処理する限り、問題ありません。