2

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

如果服务被调用两次(通常在调试期间发生),我希望服务抛出一个 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

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

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

于 2010-01-03T19:41:50.177 回答