2010-12-09 17 views
2

J'ai un service WCF qui a certaines opérations qui peuvent prendre ... Le client reçoit une exception TimeoutException, mais le serveur continue d'exécuter après l'opération longue.Détecter TimeoutException sur le côté serveur WCF

Serveur:

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! 
} 

Client:

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) { ... } 
} 

Depuis le serveur exécute certaines opérations DB, je dois détecter le délai d'attente du côté du serveur pour être en mesure de restaurer les opérations DB. J'ai essayé d'utiliser Transactions avec [TransactionFlow], TransactionScope, etc., côté client, mais les opérations DB sur le serveur utilisent des procédures stockées qui sont NESTED !!, donc je ne peux pas utiliser les transactions distribuées. (Je reçois une exception SqlException: Impossible d'utiliser SAVE TRANSACTION dans une transaction distribuée.). Si j'utilise des SP simples (qui ne sont pas imbriqués), alors la solution avec les transactions fonctionne bien.

Ma question: Comment puis-je détecter le TimeoutException, mais sur le serveur? Je suppose que c'est quelque chose lié à l'état du proxy ... ou probablement des événements qui peuvent être capturés par le serveur. Je ne suis pas sûr si la gestion de la transaction côté serveur est la solution correcte. Existe-t-il un modèle pour résoudre ce problème?

Merci!

Répondre