如何在不中止整个事务的情况下处理WCF中的FaultException?

时间:2010-01-03 01:27:49

标签: wcf faultexception

我有一个WCF服务作为事务的一部分被调用。

如果服务被调用两次(通常在调试期间发生)我希望服务抛出FaultException,但整个事务必须成功

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

由于我正在抛出一个FaultException,事务会投票中止吗?

我正在考虑这样做(设置事务完成 - 然后抛出错误) - 但我甚至不知道这是否有效。它还有some complications,我不想担心。

[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 个答案:

答案 0 :(得分:1)

您可以尝试使用事务范围选项Supress(这是您拥有的子事务范围)在事务范围中包装对WCF服务的调用。这将阻止此部分代码的异常影响环境事务。只要在退出内部/子事务范围之前处理异常,就应该没问题。

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