2011-03-02 34 views
13

Necesito agregar un elemento "en tiempo real" a mi aplicación web. Básicamente, necesito detectar los "cambios" que se almacenan en una tabla de SQL Server, y actualizar varias partes de la interfaz de usuario cuando se produce un cambio.Aplicación web ASP.NET MVC en tiempo real

Actualmente estoy haciendo esto por sondeo. Envío una solicitud de ajax al servidor cada 3 segundos solicitando nuevos cambios; estos se devuelven y procesan. Funciona, pero no me gusta, significa que para cada navegador emitiré estas solicitudes con frecuencia y el servidor siempre estará ocupado procesándolas. En resumen, no escala bien.

¿Existe alguna alternativa inteligente que evite la sobrecarga de las encuestas?

Editar

En aras de la exhaustividad, estoy actualizando esta mencionar la solución que finalmente fuimos con - SignalR. Es un SO y viene de Microsoft. Ha aumentado su popularidad, y puedo recomendarlo de todo corazón, o incluso WebSync, que también hemos visto.

+0

http://stackoverflow.com/questions/4555462/reverse-ajax-with-iis-asp-net –

Respuesta

10

Consulte WebSync, un servidor de cometas diseñado para ASP.NET/IIS.

En particular, lo que yo haría es usar la clase SQL Dependency, y cuando detecte un cambio, use RequestHandler.Publish("/channel", data); para enviar la información a los clientes de escucha apropiados.

Debería funcionar bastante bien.

+2

Debería funcionar bastante bien - dice el autor ;-) –

+1

aunque en justicia, es bastante sorprendente (WebSync) . las demostraciones (especialmente la de mapas - necesitarán 2 ventanas de navegador abiertas para eso) son muy simples pero instructivas –

+1

WebSync se ve muy bien, aunque idealmente me gustaría una solución gratuita (o mejor dicho, el cliente quisiera una ¡solución!). –

1

echar un vistazo a this article

He leído en alguna parte (no recuerdo dónde) que el uso de esta característica WCF hacer que el proceso de acogida manejar las peticiones de una manera que no consumieron hilos bloqueados.

5

tomada directamente desde el enlace refernced por Jakub (es decir):

Reverse AJAX with IIS/ASP.NET

PokeIn on codeplex le da una funcionalidad mejorada JSON para hacer sus objetos del lado del servidor disponible en el lado del cliente. Simplemente, es una biblioteca Reverse Ajax que hace que sea fácil llamar a las funciones de JavaScript desde C#/VB.NET y llamar a las funciones de C#/VB.NET desde JavaScript. Tiene numerosas funciones, como ordenar eventos, administrar recursos, manejar excepciones, calcular referencias, control de carga Ajax, compatibilidad mono, integración WCF & .NET Remoting y inserción escalable del servidor. Hay una opción de licencia comunitaria gratuita para esta biblioteca y la opción de licencia es bastante rentable en comparación con otras.

De hecho, he usado esto y la edición de comunidad es bastante especial. Vale la pena echarle un vistazo ya que este tipo de tecnología comenzará a dominar el paisaje en los próximos meses/años. el sitio codeplex viene completo con muestras asp.net mvc.

+0

Tu enlace está roto ... –

+0

jakub -cómo extraño, en realidad visité ese enlace hace no menos de 10 minutos- gracias por el aviso. ha cambiado al enlace directo del proyecto Codeplex –

+0

parece funcionar desde Canadá ... – MikeJ

5

No importa qué: siempre estará limitado al hecho de que HTTP es (principalmente) una calle de sentido único. A menos que implemente algún código sensible en el cliente (es decir, para escuchar las solicitudes de red entrantes), cualquier otra cosa implicará sondear las actualizaciones del servidor, sin importar lo que le digan los demás.

Teníamos un requisito similar: tener un tiempo de respuesta muy rápido en una de nuestras aplicaciones web en tiempo real, que atiende a entre 400 y 500 clientes por servidor web.Servidor tendría que notificar a los clientes casi dentro de 0.1 de un segundo (telefonía & VoIP).

Al final implementamos un Async Handler. En cada solicitud de sondeo, ponemos la solicitud en reposo durante 5 segundos, esperando que una señal de pulso de semáforo responda al cliente. Si los 5 segundos están activos, respondemos con un "no evento" y el cliente publicará la solicitud nuevamente (de inmediato). Esto dio como resultado tiempos de respuesta muy rápidos, y nunca tuvimos ningún problema con hasta 500 clientes por máquina ... ni idea de cuántos más podríamos agregar antes de que las solicitudes de sondeo pudieran crear un problema.

+0

Esto es más o menos lo que hice. Terminas con una cola que sondeas y extraes los eventos según sea necesario. Estoy bastante seguro de que así es como funciona el desbordamiento de pila y funciona su parte superior de la página "brindis". – MikeJ

+0

esto suena como un muy buen enfoque de sentido común para ping indeterminable .. me gusta +1 –

1

Dependiendo de las restricciones en su aplicación, puede usar Silverlight para hacer esta conexión. No necesita tener una IU para Silverlight, pero puede usar los Sockets que tienen una conexión que acepta las transferencias de datos del lado del servidor.

Cuestiones relacionadas