Завершить сеанс WCF с сервера? - PullRequest
3 голосов
/ 16 июня 2011

Это может быть выстрел в темноте (я не знаю много о внутренностях WCF), но здесь идет ...

В настоящее время я работаю с устаревшим приложением на клиентском сайте, и у нас постоянно возникает проблема с сервисом WCF. Приложение использует Microsoft Sync Framework 2.0 и синхронизируется с помощью вышеупомянутого сервиса. Реализация сервиса на стороне сервера содержит множество пользовательских кодов в различных состояниях «беспорядка».

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

Ошибка обсуждается в статье здесь , и в настоящее время мы исследуем подход перехода от безопасности уровня сообщений к безопасности транспортного уровня, который, мы надеемся, решит проблему. Однако мы можем решить ее менее инвазивным способом, если этот вопрос имеет смысл.

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

Сервис работает через пользовательский интерфейс, который реализован на стороне сервера. Единственное, что интерфейс может сделать для завершения соединения, это вызвать EndSession() на самом прокси, который вызывает EndSession() на сервере, который является пользовательским методом.

Итак ...

Из метода службы WCF существует ли способ правильно и изящно разорвать соединение с клиентом так, как это понравится клиенту?

То есть, в этом пользовательском EndSession() есть какой-то последний шаг, который я могу предпринять, чтобы сервер полностью забыл, что это соединение открыто? Поскольку выглядит , как если бы другой пользователь на том же компьютере пытался подключиться к службе в приложении, то в этом случае происходит сбой с ошибкой в ​​связанной статье.

Идея состоит в том, что на стороне клиента код, который вызывает EndSession(), сопровождается обнулением прокси-объекта, а затем вызывается фабричный метод для предоставления другого в следующий раз, когда это необходимо. Поэтому мне интересно, если на стороне сервера должно произойти что-то дополнительное (и действительно ли это происходит в WCF, если бы не весь этот пользовательский код реализации), чтобы разорвать соединение на этом конце?

Как я уже сказал, выстрел в темноте. Но, возможно, в ответах / обсуждениях здесь я могу хотя бы дополнительно диагностировать проблему, поэтому любая помощь очень ценится. Спасибо.

1 Ответ

3 голосов
/ 16 июня 2011

К сожалению, существует только три способа, которыми сеанс может быть прекращен

  1. Клиент закрывает прокси
  2. Превышено время получения сервиса до того, как клиент отправит другой запрос
  3. служба выбрасывает исключение не по вине, которая будет вины канал и так прекратить сессия

если вы не хотите, чтобы клиент был вовлечен, тогда у вас есть только 2 и 3, ни один из которых не подходит для клиента - они получат исключение в обеих ситуациях при следующей попытке связаться со службой.

Вы можете использовать Дуплексный обмен сообщениями и заставить службу уведомлять клиента о том, что она требует завершения сеанса - тогда клиент получает возможность корректно закрыть прокси-сервер, но это совместная стратегия

...