2010-01-03 34 views
2

我有一个WCF服务被称为事务的一部分。如何在不中止整个事务的情况下处理WCF中的FaultException?

如果该服务被调用两次(通常在调试过程中发生)我想要一个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

您的服务是否需要参与交易?您可以创建一系列异常,例如Book/UnBook,以便客户端首先在您的服务上调用“Book”,然后如果客户端遇到任何其他问题并需要回滚,那么部分回滚(或者您的报酬)将打电话给UnBook的服务? – 2010-01-03 22:31:18

回答

1

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

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

+0

这可能是我在找什么。我是否认为一个例外会自动投票整体交易失败? – 2010-01-04 10:56:10

+0

不确定它是否会自动进行自动投票。但是,当你得到一个异常时通常会发生的是,代码在那个时候退出,因此没有命中scope.complete,然后事务将失败。 – 2010-01-04 11:32:11

相关问题