2012-01-09 2 views
2

У меня есть приложение, ориентированное на обслуживание.уведомлять клиента, когда время сеанса заканчивается во время ожидания обратного вызова из службы

Я звоню в службу для определенного действия, а затем ждет обратного вызова от службы. Если для действия службы требуется больше времени для завершения, чем значение таймаута сеанса, я получаю исключение в службе. Но клиент продолжает ждать обратного вызова.

Есть ли способ, по которому клиент может получить уведомление о том, что сеанс закончился?

+1

Не было бы проще внедрить способ возобновления активной сессии? http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/baefef0f-0f17-44d1-8990-aa517c2e2929/ – Lloyd

+0

Извините, я как-то пропустил вставку остальных, а также выполнив активную сессию обновлять пользователя каждые N минут, используя некоторую форму фонового таймера. – Lloyd

ответ

1

Если мне что-то не хватает, я думаю, вы захотите поймать исключение и работать соответствующим образом (например, вернуть обратный вызов с недопустимым сеансовым сообщением?).

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

«Пожалуйста, войдите в систему снова и попробуйте, проверьте вашу сеть и проверьте наличие каких-либо признаков конца дней».

EDIT: В соответствии с запросом обратной связи, здесь приводится более подробная информация о моих мыслях о взаимодействии между сервером и клиентом.

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

Но тогда, как справляться с реальными сбоями, когда общения не происходит? Если вы можете считать, что ошибки связи могут произойти (и я действительно предлагаю вам это сделать), вы должны сделать свой клиент достаточно умным, по крайней мере, для обработки ошибок связи. Важно, что такая вещь выполняется, потому что, прежде всего, коммуникации не такие надежные (происходят неправильные конфигурации, сбои оборудования и т. Д.). Во-вторых, когда такое происходит, вы рискуете своей функциональностью, чтобы исчезнуть или создать реальный плохой опыт работы с пользователями. Не то, чтобы ошибки были хорошим пользовательским интерфейсом, но более отзывчивыми приложениями.

TL; Сообщите нам об этом по желанию клиента и пользователю. Важно, чтобы знал, что происходит.

+0

Я не тот, кто ниспровергнут, но этот ответ, похоже, не дает никакой полезной проницательности, и для меня бессмысленно. – oleksii

+0

Спасибо за отзыв (действительно оцененный). Думаю, я, должно быть, что-то пропустил, я не вижу причин, по которым обратная связь от сервера к клиенту будет хорошим подходом. // EDIT: Я думаю, я знаю, что вы имеете в виду, я сделаю попытку дать более объяснительный ответ. Благодарю. – Alpha

+0

хорошо посмотрим, правильно ли я понял, давайте предположим, что у вас несколько клиентов и сервис. Каждый клиент просит службу выполнить некоторые (возможно, достаточно продолжительные) работы. Затем каждый клиент хочет получить обратную связь, когда эта работа будет завершена. Сервер должен уведомлять клиентов и предоставлять некоторые результаты. Если время работы на сервере, клиент не может * (я не уверен в этом, но он выглядит так) * получать любое уведомление, так как канал закрыт на сервере, но клиент продолжает ждать. OP хочет, чтобы клиент получил уведомление в данном конкретном случае. – oleksii

0

Почему вы используете сеансы? Если вы выполняете обратный вызов с помощью wsDualHttpBinding, вам нужно использовать сеансы, но если вы используете netTcpBinding, вам не нужны сеансы. Так что времени не будет.

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