Рассмотрим следующую службу 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 () завершается неудачно с сообщением Потоковая транзакция не может быть отменена. Произошло следующее исключение: Транзакция уже была явно или явно зафиксирована или прервана.
В моем конкретном сценарии такое поведение нежелательно. Я хотел бы поймать исключение на стороне клиента и продолжить о моем бизнесе. Если возникнут какие-либо исключения, которые я не уловлю, клиент выполнит откат транзакции.
Примечание. Этот вопрос является дубликатом Как обработать исключение FaultException в WCF без прерывания всей транзакции? , но принятый ответ для меня не является удовлетворительным - важно, чтобы все операции выполнялись происходят в пределах одной и той же области транзакции.