2009-05-25 15 views
6

Tengo una aplicación cliente-servidor, en la que el servidor es esencialmente una aplicación web ASP .NET y los clientes distribuidos están aplicaciones de escritorio.El cliente (aplicación de escritorio) extrae datos ... pero quiero que el servidor (aplicación web) envíe datos

Los clientes necesitan recibir algunos datos del servidor, cuando hay nuevos datos para el cliente. En este momento, la forma en que se hace esto es que el cliente sigue consultando un servicio web cada x minutos (digamos 2 minutos) y sigue comprobando si hay nuevos datos para el cliente.

Idealmente, la forma en que debería funcionar es que la aplicación de escritorio debería recibir actualizaciones cuando estén disponibles, no es necesario extraerlas del servidor; en su lugar, el servidor debería poder presionar al cliente.

¿Cómo puedo hacer esto? Dada la arquitectura de la solución, una aplicación web necesita enviar datos a aplicaciones de escritorio (clientes) en la misma red (una LAN)?

Respuesta

7

Lo que está describiendo es "servidor de inserción", que en estos días a menudo se llama "COMET". El uso de esas palabras clave en una búsqueda web debe generar una gran cantidad de información útil.

La técnica más común para esto se llama "GET colgante". El cliente envía una solicitud GET a una URL específica, y el servidor acepta la conexión, pero demora el envío de una respuesta hasta que tenga datos para enviar. Cuando el cliente recibe la respuesta envía otro GET para que esté listo para otro mensaje.

+1

Solo quería dejar una nota que puede usar IHttpAsyncHandler (http://msdn.microsoft.com/en-us/magazine/cc164128.aspx) y System.Threading.Monitor para crear fácilmente un (tipo de) evento impulsado "server push" en .NET 2.0 Si alguien sabe de una clase de utilidad completa para esto, publique algunos enlaces – Radu094

+0

Para cada cliente, el servidor tiene que mantener activa una conexión de socket. Entonces no funcionará cuando el no. de clientes no puede predecirse de antemano. –

0

Si puede dejar un socket abierto, el cliente puede conectarse al servidor y el servidor puede simplemente insertar datos en el socket cuando corresponda. No hay ninguna razón por la cual el lado que inicia la conexión debe ser siempre el que inicie la transferencia de datos.

+0

Esta aplicación es para intranets generales en las industrias. Usar conexiones de socket, es decir, usar un socket necesitaría abrir un puerto para acceder, reconfigurar el firewall, etc. ¿Es este un requisito previo razonable de instalación o los clientes industriales generalmente se opondrán a esto? – Sameet

+0

Una conexión HTTP _es_ un socket. Lo que la respuesta (correcta) recomienda es que el cliente envíe un GET, pero el servidor demora el envío de una respuesta hasta que tenga los datos listos para enviar. –

+0

Sí, pero la conexión HTTP está en el puerto 80, que no está bloqueado por los firewalls. Lo que describiste parece perfecto, la respuesta diferida del servidor hasta que tenga datos, ¿cómo hacer esto? – Sameet

2

Puede usar devoluciones de llamada de WCF: este es un servicio web donde puede suscribirse a las notificaciones de un cliente y el servidor enviará mensajes a los clientes suscritos. Tengo un beginners guide en mi blog.

+0

WCF? ¿Algo más que simplemente .NET 2.0? Lamentablemente, .NET 2.0 es una limitación en la que necesito trabajar. ¿Las retrollamadas de WCF ayudarán en ese caso? – Sameet

+0

No, no tengo miedo, es solo WCF, me temo. – blowdart

1

Puede que le interese el SO question. Lo que está describiendo suena como una aplicación Comet: inserción de servidor en un cliente.

1

Echa un vistazo WebSync; es una solución Comet para ASP.NET/IIS, pero también hay disponible un cliente .NET completo, lo que permite la integración con clientes gruesos, servicios de Windows, etc. Parece que debería encajar muy bien.

Cuestiones relacionadas