考虑参与分布式事务的以下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?重复,但我接受的答案并不令人满意 - 重要的是所有操作都在同一事务范围内进行。
如果您只有一个事务范围,那么失败会导致整个事务回滚 - 毕竟这就是它的全部要点。如果您想要在不影响整体交易的情况下发生“孤立”子交易,您需要使用其他问题中显示的方法。我没有看到任何其他方法 - 选择这两种解决方案之一 - 没有其他“魔术”方式... – 2011-02-17 17:40:57
是的,我理解这种行为的重点,但我希望能够说错误定义在合同中(或者某个子集)不是失败。看起来这是不可能的。 – 2011-02-18 21:21:09