我有一个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服务抛出错误但仍允许事务成功的最佳方法是什么?
答案 0 :(得分:1)
您可以尝试使用事务范围选项Supress(这是您拥有的子事务范围)在事务范围中包装对WCF服务的调用。这将阻止此部分代码的异常影响环境事务。只要在退出内部/子事务范围之前处理异常,就应该没问题。
http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx