Как обнаружить двусвязных клиентов Duplex Polling - PullRequest
6 голосов
/ 10 ноября 2010

Я следовал примеру Tomek Janczuk Pub / sub, используя дуплексный канал HTTP WCF для опроса HTTP , но я заметил, что, когда клиент отключается, закрывая браузер, служба не замечает следующий обратный вызов.Я бы ожидал исключение или что-то, что могло бы сказать, что конечной точки там больше не было.

Как узнать, когда клиент ушел, чтобы прекратить публикацию на этом клиенте?

Ответы [ 4 ]

5 голосов
/ 10 ноября 2010

Точно знать: невозможно .

Когда TCP-соединение закрыто (в основе HTTP-вызова), на сервер отправляется специальное TCP-сообщение - FIN пакет. Несмотря на то, что HTTP не имеет состояния, основное TCP-соединение находится в состоянии и с поддержкой активности, основное TCP-соединение обычно остается открытым. Если клиент удаляется, TCP-соединение закрывается и обычно сообщение отправляется на сервер. Но если он выходит из строя или его сеть отключается, у него не будет времени для этого. Итак, одним словом, вы никогда не можете быть уверены.

Здесь для получения дополнительной информации.

3 голосов
/ 11 ноября 2010

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

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

3 голосов
/ 10 ноября 2010

Трудно, почти невозможно (причина ограниченных возможностей SL duplex). мы реализовали список пользователей в нашем сервисе, и мы добавили свойство «IsDisconnected» и LastCommunicationTime, как только сервис WCF получает тайм-аут, когда пытается добавить сообщение в пользовательскую очередь исходящих сообщений, происходит сбой и выдается исключение тайм-аут мы помечаем «IsDisconnecte = true» и в следующий раз не пытаемся отправить сообщение этому пользователю.

Другой поток продолжает смотреть на это, и если он замечает, что LastCommunicationTime превышен значением времени и IsDisconnected = true, он удаляет пользователя из списка, если только тот же пользователь не попытается снова подключиться в течение этого периода времени (который мы идентифицируем по его идентификатору пользователя).

Мы сделали так много вещей, чтобы справиться с этой проблемой вручную, так как служба WCF была очень занята.

1 голос
/ 12 мая 2011

Я столкнулся с этой проблемой и создал поток, который удаляет отключенных клиентов со следующим кодом.Он работает нормально, но удаляет отключенного клиента из списка клиентов через 10-15 минут (для меня это нормально).

...