Вопрос

Я следовал Tomek Janczuk's Образец PUB / SUB с использованием HTTP-оверивающего канала Duplex WCF Но я заметил, что когда клиент отключается, закрывая браузер, сервис не замечает в следующем обратном вызове. Я бы ожидал исключения или что-то сказать, что конечная точка больше не было там.

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

Это было полезно?

Решение

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

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

Другие советы

Знать наверняка: невозможный.

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

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

Его тяжело, почти невозможно (Причина ограниченных дуплексных возможностей SL). Мы внедрили список пользователей в нашем сервисе, и мы добавили свойство «ISDisconnected» и LastCommunicationTime, после того как служба WCF получает тайм-аут, когда пытается добавить сообщение в исходящую очередь сообщений пользователя, а также сбой, и бросает исключение тайм-аута. Мы отмечаем «iSdisconnecte = True», и в следующий раз не пытайтесь отправить сообщение этого пользователя.

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

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

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

    new Thread(new ThreadStart(() =>
    {
        while (SilverlightClients != null)
        {
                lock (SilverlightClients)
                {
                    SilverlightClients = SilverlightClients.Where(d => (d.Callback as IContextChannel).State != CommunicationState.Opened).ToList();
                }

            Thread.Sleep(1000);
        }
    })) { Name = "Thread Remove Disconnected Clients" }.Start();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top