Pregunta

He seguido de Tomek Janczuk bar / sub muestra usando HTTP sondeo de canal dúplex de WCF pero me he dado cuenta de que cuando un cliente se desconecta al cerrar el navegador, el servicio no se da cuenta en la siguiente devolución de llamada. Yo habría esperado una excepción o algo que decir que el punto final no estaba allí por más tiempo.

¿Cómo puede saber cuando un cliente se ha ido, con el fin de detener la publicación de ese cliente?

¿Fue útil?

Solución

Parece que hay un poco satisfactoria, aunque solución simple:. Si los tiempos de devolución de llamada de salida del cliente, no lo llaman de nuevo

En mi sistema también he implementado un manual de "verificación" llamada - todos los n segundos que el servidor llama a un método sin parámetros a través del canal de devolución de llamada para cada cliente registrado, sólo para ver si el cliente es aún allí. Estoy empezando a preguntarse si lo que realmente era una buena idea -. Tengo un nuevo problema en el que un tiempo de espera de devolución de llamada sigue ocurriendo porque he suspendido el cliente en el depurador

Otros consejos

Para saber con seguridad: imposible .

Cuando se cierra una conexión TCP (subyacente una llamada HTTP), un mensaje especial TCP se envía al servidor - paquete FIN. Aunque HTTP no tiene estado, que subyace en cada conexión TCP con estado y con mantengas vivo, que subyace en conexión TCP por lo general permanece abierto. Si el cliente está dispuesto, conexión TCP se cierra y, normalmente, un mensaje se envía al servidor. Pero si se bloquea o se desconecta de su red, no tendría el tiempo para hacer esto. Así, en una palabra, nunca se puede estar seguro.

Aquí para obtener más información.

Es difícil, casi imposible (causa de la limitada SL funciones dúplex). hemos puesto en marcha una lista de usuarios en nuestro servicio, y hemos añadido una propiedad "IsDisconnected" y LastCommunicationTime, una vez que el servicio WCF consigue un tiempo de espera cuando intenta agregar un mensaje en el del usuario Saliente-Mensaje-Cola, y falla, y se produce una excepción de tiempo de espera. marcamos "IsDisconnecte = true" y la próxima vez no tratamos de enviar el mensaje a ese usuario.

Otro hilo mantiene mirando eso y si nota que el LastCommunicationTime ha sido superado por un valor del tiempo y IsDisconnected = true, elimina el usuario de la lista, a menos que los mismos intentos de los usuarios se conecten de nuevo dentro de este período de tiempo (que se identifican por su identificación de usuario).

Hay tantas cosas que hicimos manualmente para manejar este problema, ya que estaba haciendo el servicio WCF tanto ocupado.

Me enfrentó a este problema y creó un hilo que elimina los clientes desconectados con el siguiente código. Funciona bien, pero cae el cliente desconectado de la lista de clientes después de 10-15 minutos (que estaba bien para mí).

    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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top