在抛出错误时,我可以阻止WCF回滚事务吗?

时间:2011-02-17 17:13:23

标签: .net wcf distributed-transactions

考虑以下参与分布式事务的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();
}

当从 ThrowError()抛出FaultException时,WCF回滚分布式事务,其中包括 DoSomething()完成的工作。然后,客户端对 DoSomethingElse()的调用失败,并显示消息无法解组流动的事务。发生以下异常:事务已被隐式或显式提交或中止。

在我的特定情况下,这种行为是不受欢迎的。我想在客户端捕获异常并继续我的业务。如果发生任何我未捕获的异常,客户端将回滚该事务。

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

1 个答案:

答案 0 :(得分:4)

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