2010-12-09 76 views
2

我有一個WCF服務,有一些操作可能需要很長時間... 客戶端接收到TimeoutException,但服務器在長時間操作後繼續執行。檢測服務器端的TimeoutException WCF

服務器:

public void doSomeWork(TransmissionObject o) { 
    doDBOperation1(o); // 
    doDBOperation2(o); // may result in TimeoutException on client 
    doDBOperation3(o); // it continues doing DB operations. The client is unaware! 
} 

客戶:

ServiceReference.IServiceClient cli = new ServiceReference.IServiceClient("WSHttpBinding_IService","http://localhost:3237/Test/service.svc"); 
int size = 1000; 
Boolean done = false; 
TransmissionObject o = null; 

while(!done) { 
    o = createTransmissionObject(size); 
    try { 
     cli.doSomeWork(o); 
     done = true; 
    }catch(TimeoutException ex) { 
     // We want to reduce the size of the object, and try again 
     size--; 
     // the DB operations in server succeed, but the client doesn't know 
     // this makes errors. 
    }catch(Exception ex) { ... } 
} 

由於服務器正在執行某些數據庫操作,我需要檢測在服務器端超時要能夠回滾數據庫操作。

我試圖用與[TransactionFlow]的TransactionScope等交易,在客戶端,但在服務器上的數據庫操作使用它們嵌套!!存儲過程,所以我不能使用分佈式事務。 (我收到一個SqlException說:不能在分佈式事務中使用SAVE TRANSACTION。)。如果我使用簡單的SP(不是嵌套的),那麼交易解決方案就可以正常工作。

我的問題: 如何檢測TimeoutException,但在服務器端?我猜是與代理狀態有關的東西......或者可能是服務器可以捕獲的一些事件。 我不確定在服務器端處理交易是否是正確的解決方案。 是否有解決此問題的模式?

謝謝!

回答