У меня есть служба 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, но на стороне сервера? Я предполагаю, что это связано с состоянием прокси ... или, возможно, с некоторыми событиями, которые могут быть захвачены сервером.
Я не уверен, что обработка транзакции на стороне сервера является правильным решением ..
Есть шаблон для решения этой проблемы?
Спасибо!