2015-06-11 9 views
6

Я использую синхронную службу WCF, которая работает хорошо в 99% случаев, но в некоторых очень редких случаях клиент заканчивает работу до завершения обработки сервера. Есть ли способ обнаружить на стороне SERVER время ожидания клиента? Я мог бы использовать async-операцию, но в этом случае обнаружение тайм-аута на стороне сервера спасло бы мне довольно много работы. Я использую привязку net.tcp, если это имеет значение.Как определить исключение таймаута клиента на стороне сервера?

+0

Async не изменит время работы тайм-аутов. – usr

+0

Операции async WCF не имеют возвращаемых значений и не ждут завершения операции на стороне сервера. Мои тайм-ауты происходят из-за (случайной) длительной обработки на стороне сервера, без проблем с сетью. Таким образом, операция async решит эту проблему, но я ищу другое решение. –

+0

Когда вы говорите «асинхронный» WCF, вы говорите об операциях «async/await» или OneWay? Из вашего комментария это звучит как операции OneWay. Что касается обнаружения тайм-аута на клиенте, я не уверен, что вы могли бы, так как это было на стороне клиента. Сервер должен будет каким-то образом опросить клиента, чтобы убедиться, что он все еще встал - возможно, двусторонняя привязка. – Tim

ответ

1

Для net.tcp, http и т. Д. Вообще нет. (см. комментарии выше для некоторых идей, а также может быть другим для других протоколов/привязок/и т. д.)

Причина в том, что код инфраструктуры WCF на стороне сервера не будет использовать канал до того, как он завершит выполнение код реализации служебной операции и сортировка ответа. Только тогда он попытается отправить ответ и в этот момент поймет, что соединение уже было прервано клиентом.

Когда сервер получает эту ошибку, код пользователя (ваша реализация служебной операции) уже выполнен и, следовательно, вы больше не можете реагировать на это. Возможно, это возможно из диспетчера или другой точки распространения, но лично я не пробовал. Однако это также не спасет ваш сервер от ненужной работы, потому что, как сказано, отключение клиента будет по-прежнему распознаваться только тогда, когда сервер действительно пытается отправить ответ.

Одним из «простых» способов устранения таких проблем может быть разделение выполняемой работы на несколько служебных операций/вызовов (если это вообще возможно, а не случайное введение состояния на стороне сервера в процессе). Или, как говорили другие, попросите клиента реализовать интерфейс «Ping», который сервер может использовать, чтобы проверить, остается ли клиент «живым», и ответ по-прежнему необходим.

Смежные вопросы