2011-02-17 61 views
3

考虑参与分布式事务的以下WCF服务。 WCF的正常行为是在发生任何故障时回滚事务。有什么方法可以覆盖该行为吗?我可以阻止WCF在抛出错误时回滚事务吗?

服务合同:

[ServiceContract] 
public interface ITestService { 
    [OperationContract] 
    [FaultContract(typeof(TestServiceFault))] 
    void ThrowError(); 
    [OperationContract] 
    void DoSomething(); 
    [OperationContract] 
    void DoSomethingElse(); 
} 

[DataContract] 
public class TestServiceFault{} 

服务实现:

class TestService : ITestService { 
    [OperationBehavior(TransactionScopeRequired = true)] 
    [TransactionFlow(TransactionFlowOption.Mandatory)] 
    public void ThrowError() { 
     throw new FaultException<TestServiceFault>(new TestServiceFault()); 
    } 
    [OperationBehavior(TransactionScopeRequired = true)] 
    [TransactionFlow(TransactionFlowOption.Mandatory)] 
    public void DoSomething() { 
     // 
     // ... 
     // 
    } 
    [OperationBehavior(TransactionScopeRequired = true)] 
    [TransactionFlow(TransactionFlowOption.Mandatory)] 
    public void DoSomethingElse() { 
     // 
     // ... 
     // 
    } 
} 

客户端执行片断:

using(new TransactionScope()) { 
    testServiceClient.DoSomething(); 

    try { 
     testServiceClient.ThrowError(); 
    } catch(FaultException<TestServiceFault>) {} 

    testServiceClient.DoSomethingElse(); 
} 

当的FaultException从ThrowError()抛出,WCF回滚公司的分布式交易卢德斯所做的工作由DoSomething()。然后,客户端调用DoSomethingElse()失败,并显示消息流式处理无法解组。发生以下异常:事务已被隐式或显式提交或中止。

在我特殊的情况下,这种行为是不可取的。我想在客户端抓住这个例外,并继续关注我的业务。如果发生任何我没有发现的异常,客户端将回滚事务。

注意:此问题与How to handle a FaultException in WCF without aborting the whole transaction?重复,但我接受的答案并不令人满意 - 重要的是所有操作都在同一事务范围内进行。

+2

如果您只有一个事务范围,那么失败会导致整个事务回滚 - 毕竟这就是它的全部要点。如果您想要在不影响整体交易的情况下发生“孤立”子交易,您需要使用其他问题中显示的方法。我没有看到任何其他方法 - 选择这两种解决方案之一 - 没有其他“魔术”方式... – 2011-02-17 17:40:57

+1

是的,我理解这种行为的重点,但我希望能够说错误定义在合同中(或者某个子集)不是失败。看起来这是不可能的。 – 2011-02-18 21:21:09

回答

4

好吧,您可以尝试在服务端设置TransactionAutoComplete = false, ,然后使用SetTransactionComplete()来防止异常将您的工作回滚。

相关问题