トランザクションの一部として呼び出されている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サービスに障害をスローさせながら、トランザクションを成功させるための最良の方法は何ですか?