asp.net - net - session has not been configured for this application or request.
SignalR y HttpContext/Session (4)
Entiendo por qué SignalR no le da acceso a HttpContext . Sin embargo, esto es bastante problemático para nosotros. Dejame explicar:
Nuestra aplicación es una aplicación Multi-Tenant donde el usuario elige el entorno al iniciar sesión. Esto básicamente registra el ConnectionStringName en la HttpSession. En nuestro concentrador SignalR, necesitamos acceder a la base de datos en Disconnect
. Pero esto no es posible porque no tenemos HttpContext en este punto y no podemos determinar el entorno para escribir.
¿Alguien puede darnos una sugerencia sobre cómo resolver este problema? Estamos un poco estancados en este caso.
EDITAR : Punto de bonificación si su solución funciona en un entorno de carga equilibrada.
El hecho de que necesite que su solución esté funcionando en un entorno de carga equilibrada exige el hecho de que necesita almacenar su cadena de conexión en algo diferente de la sesión. Un almacén de valor-clave (cómo implementarlo no importa) donde la clave es el ConnectionId (la única información disponible en la desconexión) y el valor es la cadena de conexión. Puedes seguir usando Session en cualquier otro lugar si lo deseas, pero creo que deberías mover toda la aplicación para escribir y leer desde allí, al menos para esa información.
Esta es una pregunta antigua, pero dejo mi respuesta en caso de que sea útil para alguien.
Dado que su concentrador extiende Microsoft.AspNet.SignalR.Hub , tiene acceso a la propiedad Contexto de tipo HubCallerContext
Esta propiedad expone mucha información de la persona que llama:
- ConnectionId
- Encabezados
- QueryString
- Solicitud
- Galletas
- Usuario
En mi solución, uso el nombre de usuario almacenado en Context.User.Identity.Name como clave en mi almacén de clave / valor ( Redis en mi caso) para realizar un seguimiento de todas las conexiones que tiene un usuario.
Puede anular OnConnnect y OnDisconnect para mantener la lista de conexiones asociadas al usuario. También puede almacenar cualquier otra cosa que desee junto con los identificadores de conexiones (las cadenas de conexión de su usuario, en su caso).
Hola, tuve un problema similar, ya que necesitaba identificar visitantes no autenticados en mi aplicación para personalizar sus solicitudes al concentrador SignalR.
Lo he resuelto accediendo a "HttpContext.Current.Request.AnonymousId". AnonymousId se asigna a un registro temporal en una entidad de sesión auto-implementada en una base de datos SQL, emulando esencialmente una sesión respaldada por una base de datos.
Aquí hay algunos documentos relevantes en caso de que desee personalizar el AnonymousId, o inicializar la entrada de la base de datos: http://msdn.microsoft.com/en-us/library/system.web.httprequest.anonymousid.aspx
Además, debería poder acceder al contexto en OnDisconnected () de esta manera: Context.Request.GetHttpContext () .
Espero que esto ayude.
Puede usar algo como un Diccionario para realizar un seguimiento del ConnectionId del usuario cuando se conectan. También usar SQL Server para almacenar el estado de sesión también puede ayudar: http://support.microsoft.com/kb/317604
SignalR le da acceso a User.Identity.Name que puede usar para rastrear cuando se dispara el disoconnect ().