Рассмотрим следующую службу 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 без прерывания всей транзакции?, но принятого ответа нет Меня это не устраивает - важно, чтобы все операции выполнялись в рамках одной транзакции.