Обнаружение TimeoutException на стороне сервера WCF - PullRequest
2 голосов
/ 09 декабря 2010

У меня есть служба 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 и т. Д. На стороне клиента, но операции с БД на сервере используют хранимые процедуры, которые НЕ ВРЕМЕННЫ !! (Я получаю сообщение об ошибке SqlException: «Невозможно использовать SAVE TRANSACTION в распределенной транзакции».) Если я использую простые SP (которые не являются вложенными), то решение с транзакциями работает нормально.

Мой вопрос: Как я могу обнаружить TimeoutException, но на стороне сервера? Я предполагаю, что это связано с состоянием прокси ... или, возможно, с некоторыми событиями, которые могут быть захвачены сервером. Я не уверен, что обработка транзакции на стороне сервера является правильным решением .. Есть шаблон для решения этой проблемы?

Спасибо!

1 Ответ

0 голосов
/ 09 декабря 2010

Вместо ожидания истечения времени ожидания операции вы можете использовать асинхронные операции, как в этом сообщении в блоге: http://www.danrigsby.com/blog/index.php/2008/03/18/async-operations-in-wcf-event-based-model/

Идея состоит в том, что вы точно ожидаете, что операция займет некоторое время.Сервер сообщит клиенту, когда работа будет завершена.

...