JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Simular notificaciones PUSH en una página Web

RefreshEn mi último post describía la arquitectura que utilizan tanto iPhone como Windows Phone 7 para enviar notificaciones PUSH desde aplicaciones externas a los usuarios de los teléfonos. La comunicación entre el dispositivo y el servicio de notificaciones se basaba en una conexión “raw” permanentemente abierta entre ambos. Pero ¿cómo podemos simular algo así en una página Web?

Hace poco un alumno de mi curso de preparación del examen 70-515 de desarrollo Web con tecnologías Microsoft, me preguntaba acerca de esta cuestión. En concreto la pregunta iba sobre sobre cómo conseguir el efecto de actualización automática de información que consiguen algunas páginas (como las de apuestas o de información bursátil) en las que el servidor envía información a los clientes sin que haya –aparentemente- una petición explícita por parte de éstos. Este comportamiento se asemeja mucho al de las notificaciones que describía en el anterior post.

Además había creado ya un servicio WCF y tenían una aplicación Windows Forms en la que utilizaban los callbacks de WCF para conseguir este efecto. La pregunta era también si es posible utilizar los callbacks de WCF en ASP.NET para hacer esto, y en caso negativo qué otras soluciones existen para conseguir algo similar.

Notificaciones en una aplicación Web

En una página Web normal no hay forma de recibir notificaciones PUSH (es decir desde el servidor al cliente, bajo demanda del servidor), que es lo que buscamos. No podemos dejar una conexión abierta por la propia naturaleza de HTTP.

Por otro lado el futuro HTML5 define el manejo de Sockets puros desde JavaScript (desde el modelo de objetos del navegador, vamos) y con eso se solventarán situaciones como esta en el futuro, pero hoy por hoy no es una solución razonable. Además simplificaría programación de cierto bajo nivel. Para mi sería matar moscas a cañonazos: algo que estará bien para cosas muy particulares, pero de uso muy limitado.

Por todo eso la opción real que existe es utilizar PULL desde el cliente, es decir, pedir periódicamente desde el navegador los datos al servidor. En una aplicación Windows Forms la cosa es completamente diferente, pues puedes mantener una conexión abierta todo el tiempo con el servicio WCF y recibir notificaciones de éste, cosa que no es posible hoy en día desde el navegador, como comento.

La mejor manera de hacer esto en una aplicación Web es exponer los datos del servicio WCF como JSON (o como un método estático accedido con retrollamadas de red de ASP.NET AJAX) y hacer llamadas periódicas desde la página Web a dicho servicio para que te devuelva por AJAX los datos pertinentes. Puedes recibir todos los datos o, si hay alguna marca temporal (por ejemplo la fecha y hora de la última comprobación) que te devuelva únicamente los datos que hayan cambiado.
 
Con jQuery, por ejemplo, es muy fácil de hacer, e incluso con jQuery Templates puedes generar la interfaz de lado cliente de modo dinámico, por lo que complicas un poquito el desarrollo pero mejoras la eficiencia del trasiego de información (comparado con usar, por ejemplo, un UpdatePanel, que los carga el diablo).

Por supuesto tampoco pasa nada si no quieres complicarte la vida y si la aplicación no mueve entre cliente y servidor una cantidad ingente de datos, puedes usar un UpdatePanel de ASP.NET AJAX combinado con un Timer de ASP.NET AJAX para refrescar el listado en la página sin ni siquiera tener que escribir código. Eso sí, si lo haces desactiva el ViewState de la rejilla para que no pesen mucho los postbacks al servidor. Lo malo del UpdatePanel es, como es sabido, que en realidad se recarga la página completa y se transmite el ViewState (que hay que mantener bajo control o te ralentiza mucho), pero si logras controlar el tamaño de la información transferida entre cliente y servidor y viceversa, es una opción rápida y sencilla de implementar, sin escribir una sola línea de código. Lo cual es estupendo :-)

En este caso además, en cuanto al rendimiento, dependerá del periodo de refresco que le establezcamos al Timer. Una página Web no puede funcionar igual que una aplicación de escritorio por la propia naturaleza del medio, que es diferente: es desconectado, puede haber muchos potenciales usuarios y las peticiones a un servidor pueden llegar a saturarlo si hay muchos clientes, la propia página si hay muchos datos puede tardar en recargarse... Para hacer cosas en tiempo real no es lo adecuado, desde luego. Ahora bien si va a ser usada por poca gente en una Intranet, por ejemplo, y las peticiones no cargan en exceso el servidor quizá podamos bajar el periodo del Timer sin problemas, aunque no a décimas der segundo ni nada parecido...

En resumen, para mi la mejor opción es usar jQuery Templates para generar directamente desde el lado cliente la interfaz: devolver los datos desde el WCF en formato JSON, consumirlos desde $.Ajax() y recrear la interfaz con los nuevos datos. Es eficiente, rápido, no carga el servidor, etc... muchas ventajas, pero es más complicado que usar controles ASP.NET AJAX de servidor como el UpdatePanel.

¡Espero que te resulte útil!

José Manuel Alarcón José Manuel Alarcón
Fundador y director de campusMVP.es, el proyecto de referencia en formación on-line para programadores en lengua española. Autor de varios libros y cientos de artículos. Galardonado como MVP de Microsoft desde 2004. Gallego de Vigo, amante de la ciencia y la tecnología, la música y la lectura. Ayudando a la gente en Internet desde 1996.
Mi último libro (no técnico): "Tres Monos, Diez Minutos".
Banner

Comentarios (1) -

Qué tal ?
Me quedocon :

"la mejor opción es usar jQuery Templates para generar directamente desde el lado cliente la interfaz: devolver los datos desde el WCF en formato JSON, consumirlos desde $.Ajax() y recrear la interfaz con los nuevos datos. Es eficiente, rápido, no carga el servidor, etc... muchas ventajas, pero es más complicado que usar controles ASP.NET AJAX de servidor como el UpdatePanel."

Algún buen ejemplo con código de JQuery Templates + WCF + JSON + JQuery ? Ya son unas cuántas "tecnologías" juntas...

saludos !!!

Responder

Agregar comentario