Можно ли предотвратить откат транзакции WCF при возникновении ошибки? - PullRequest
3 голосов
/ 17 февраля 2011

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

1 Ответ

4 голосов
/ 20 февраля 2011

хорошо, вы можете попробовать установить TransactionAutoComplete = false на стороне службы, а затем использовать SetTransactionComplete (), чтобы исключение не откатило вашу работу.

...