2011-02-17 63 views
3

考慮參與分佈式事務的以下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?重複,但我接受的答案並不令人滿意 - 重要的是所有操作都在同一事務範圍內進行。

+2

如果您只有一個事務範圍,那麼失敗會導致整個事務回滾 - 畢竟這就是它的全部要點。如果您想要在不影響整體交易的情況下發生「孤立」子交易,您需要使用其他問題中顯示的方法。我沒有看到任何其他方法 - 選擇這兩種解決方案之一 - 沒有其他「魔術」方式... – 2011-02-17 17:40:57

+1

是的,我理解這種行爲的重點,但我希望能夠說錯誤定義在合同中(或者某個子集)不是失敗。看起來這是不可能的。 – 2011-02-18 21:21:09

回答

4

好吧,您可以嘗試在服務端設置TransactionAutoComplete = false, ,然後使用SetTransactionComplete()來防止異常將您的工作回滾。

相關問題