检测服务器端WCF上的TimeoutException

时间:2010-12-09 14:06:09

标签: wcf transactions timeoutexception

我有一个WCF服务有一些可能需要很长时间的操作...   客户端收到TimeoutException,但服务器在长时间操作后继续执行。

服务器:

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等,但服务器上的数据库操作使用NESTED !!的存储过程,因此我不能使用分布式事务。 (我收到一个SqlException说:不能在分布式事务中使用SAVE TRANSACTION。)。如果我使用简单的SP(不嵌套),那么带有事务的解决方案可以正常工作。

我的问题:   如何检测TimeoutException,但在服务器端?我猜是与代理状态有关的东西......或者可能是服务器可以捕获的一些事件。   我不确定在服务器端处理事务是否是正确的解决方案..   有没有解决这个问题的模式?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以考虑使用异步操作,而不是等待操作超时,如以下博文:http://www.danrigsby.com/blog/index.php/2008/03/18/async-operations-in-wcf-event-based-model/

这个想法是你准确地期望一项操作需要一些时间。作业完成后,服务器将向客户端发出信号。