2012-04-10 35 views
6

Estoy trabajando en una aplicación que necesita notificar al usuario cuando recibe una nueva notificación. La aplicación se hospedará en Azure y será .NET MVC 3 (probablemente no es importante, pero para su información). TambiénNotificaciones push de SignalR a todas las instancias del navegador de un solo usuario autenticado

Las notificaciones se guardan en un MSBQL db (2008) y tienen un campo IsRead. Las notificaciones se generan a partir de diversas acciones de usuario y servidor. Según las preferencias del usuario, algunas notificaciones se crearán con IsRead == false.

tengo 2 escenarios diferentes que siento que SignalR será perfecto en el manejo, que sólo necesita un poco de orientación:

  1. usuario tiene varias ventanas abiertas navegando por el sitio y una nueva fila de notificación se añade, asignado a ese usuario, con IsRead == true
    • me gustaría que todas las instancias del navegador del usuario específica para tener una función específica llamada js para revelar una notificación emergente
  2. usuario tiene varias viento Abre y hace clic en la ventana emergente de notificación.
    • Me gustaría que todas las instancias de navegador del usuario específico tengan una función js específica llamada para eliminar la notificación emergente. (Sólo la instancia del navegador específico que maneja el clic también se ejecutará una función js para mostrar los detalles de notificación)

Lo que he tratado


Para el primer escenario, creo que la misma acción que causa que la notificación se escriba en la base de datos tendrá la responsabilidad de notificar todas las instancias del navegador del usuario.

El segundo escenario sería similar, al hacer clic en el elemento emergente, un punto final del servidor se llamaría mediante Ajax y ese punto final actualizaría el db para marcar la notificación como leída y luego notificaría todas las instancias del navegador del otro usuario .

Si hay una manera de hacer un seguimiento de los clientes SignalR basado en formularios de ASP.NET de autenticación de nombre de usuario, entonces creo que va a trabajar en la solución de los problemas en ambos escenarios.

TL; DR


Mi principal problema es que no sé cómo la señal de todos los casos del navegador de un usuario específico utilizando SignalR. Estaba pensando en crear un grupo basado en el nombre de usuario de Autenticación de formularios ASP.NET. ¿Esto funcionaría? ¿Hay alguna manera más sencilla que esté integrada en SignalR que maneje esto?

Respuesta

15

Su llamada para crear un grupo con el nombre de usuario como clave es buena y creo que es la más rápida de implementar.Puede llamar a una función cada vez (se cambia y ID de conexión) una página se carga mediante la suscripción de la:

$.connection.hub.start(function() { 
    yourHub.register(); 
}); 

Y en el centro de operaciones en código detrás:

public void Register() 
{ 
    AddToGroup(username); 
} 

Y cuando se quiere refrescar las pantallas del cliente que hace:

Clients[username].refreshClientScreen(); 

Dónde refreshClientScreen() es su javascript función que hace el trabajo de ocultar la notificación en el navegador.

Otra forma de hacerlo es comprobar el ConnectionId en cada solicitud y tener un lugar donde registrarse y conservar las conexiones del usuario en el servidor. Cuando tenga que actualizarlos puede utilizar este código en cada uno de ellos:

Clients[ConnectionId].refreshClientScreen(); 

Puede encontrar el ID de conexión en el Contexto objeto de un concentrador.

creo que el segundo enfoque es más difícil de implementar porque hay que gestionar cuando se ahorraría los ID de conexión -s y suscribirse al evento de desconexión mediante la implementación de IDisconnect para que pueda mantener su ID de conexión lista -s hasta hasta la fecha, así que elegiría el primer enfoque, el de los grupos.

+0

Gracias por su comentario. ¡Lo probaré y veré cómo funciona! –

+0

¡Eso funcionó muy bien! Gracias :) –

Cuestiones relacionadas