考慮參與分佈式事務的以下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