2009-12-28 19 views
10

Me preocupa la posibilidad de que las sesiones de mis usuarios sean eliminadas. Estoy usando el objeto de sesión ASP.NET predeterminado y las cookies de sesión. Sé que las sesiones pueden expirar, y he establecido el valor del tiempo de espera para mis sesiones en varias horas para evitar tiempos de espera inesperados.hace un cambio a un sitio ASP.NET matar sesiones activas?

Pero hay al menos otros dos casos que me preocupan.

(1) Entiendo que ASP.NET recicla periódicamente el dominio de la aplicación que ejecuta un sitio/aplicación web (no estoy seguro de si tengo toda la terminología correcta aquí). ¿Las sesiones viven en estos eventos de reciclaje?

(2) Al menos en mi servidor de desarrollo, ciertos cambios que realizo en el sitio (por ejemplo, agregar una nueva página) parecen causar la pérdida de la sesión activa cuando el sitio (o parte de él) se recompila . Esto no parece suceder con cada cambio, pero con muchos sí lo hace. Estoy particularmente preocupado por lo que esto significa para la posibilidad de cambios mientras mi sitio es en vivo. Me gustaría saber las reglas de lo que puedo actualizar sin provocar la muerte de las sesiones activas.

Gracias por cualquier apuntador.

Respuesta

12

Esto depende de su modo de estado de la sesión. Aquí está una copia de algo que puede encontrar en Microsoft Support:

ASP.NET es compatible con tres modos de Estado sesión:

  • InProc: almacena los valores del modo InProc en la memoria de la ASP .NET proceso de trabajo. Por lo tanto, este modo ofrece el acceso más rápido a estos valores. Sin embargo, cuando el proceso de trabajo ASP.NET se recicla, los datos de estado se pierden .
  • StateServer: Alternativamente, el modo StateServer usa un servicio independiente de Microsoft Windows para almacenar las variables de sesión . Como este servicio es independiente de Microsoft Internet Information Server (IIS), se puede ejecutar en un servidor diferente. Puede utilizar este modo para una solución de equilibrio de carga porque varios servidores web pueden compartir variables de sesión. Aunque las variables de sesión no se pierden si reinicia IIS, el rendimiento se ve afectado al cruzar los límites del proceso.
  • SqlServer: Si usted es una gran preocupación por la persistencia de información de la sesión, puede utilizar el modo SqlServer para aprovechar Microsoft SQL Server para asegurar el nivel más alto de fiabilidad . El modo SqlServer es similar al modo fuera de proceso, excepto que los datos de la sesión se mantienen en un servidor SQL. El modo SqlServer también le permite utilizar un almacén de estado que se encuentra fuera del proceso de IIS y que puede ubicarse en el equipo local o en un servidor remoto.

Si utiliza una base de datos o StateServer datos de la sesión no se perderán cuando IIS detecta un cambio en el sitio web.

+0

@Jochen, es irrelevante agregar chit-chat como 'Hola', 'Espero que ayude', etc. :-) –

+0

Gracias. Sí, también encontré esto: http://www.hanselman.com/blog/CommentView.aspx?guid=1fe4931a-ec50-4288-91e4-8d83a598a5be Parece que estaba pensando ingenuamente que la solución InProc era razonable, pero parece bastante inútil ya que nunca se sabe cuándo puede morir una sesión. Creo que probaré la opción SqlServer. –

+1

En mi opinión, StateServer es el más fácil de usar y el de mejor rendimiento si InProc no es una opción. – Jochen

3

(1) Si se utiliza en modo de sesión en proceso de reciclaje del grupo de aplicaciones si no se pierden la información de sesión

(2) Depende si está utilizando la aplicación web o modelo de sitio web para su uso de asp.net . Algunos archivos se almacenan en la memoria caché al inicio de la aplicación y requieren reiniciarse o recompilarse si se modifican. La regla práctica es que si cambia Global.asax, el archivo de configuración de agregar, eliminar o editar el archivo en la carpeta \ bin se emitirá un reinicio de la aplicación y se perderán los datos de la sesión en proceso.

ASP.NET La sesión tiene muchos defectos y muchos desarrolladores no la usan en absoluto. Personalmente prefiero almacenar datos en tablas personalizadas en el servidor SQL (si está disponible).

Si desea proporcionar más información, como qué versión de IIS tiene, utiliza el sitio web o el modelo de aplicación web, ¿tiene el servidor de base de datos disponible? ¿Utiliza el entorno del servidor web o de la granja web? información que desea almacenar y por cuánto tiempo puedo darle consejos más concretos.

+0

Gracias por la información adicional. ¿Estás diciendo que no usas ni siquiera la versión del servidor sql de las sesiones de ASP.NET? ¿Cuáles son los defectos con las sesiones sql de ASP.NET? –

+2

En el modo predeterminado, el módulo de sesión causa dos desplazamientos al DB: uno al comienzo de la página para leer los datos y actualizar el tiempo de caducidad de la sesión, y otro al final de la página para actualizar los datos de la sesión . Además, emite un bloqueo exclusivo en los datos de la sesión, por lo que si tiene páginas del mismo usuario que podrían ejecutarse en paralelo (como marcos o Ajax), se verán obligados a ejecutar en serie, debido al bloqueo. Puede mitigar algunos de los problemas al marcar páginas que no necesitan estado de sesión o que solo lo necesitan en modo de solo lectura. – RickNZ

+0

Estoy completamente de acuerdo con RickNZ.Además, el modelo de programación de sesiones fuera de la caja no es bueno en absoluto debido a los moldes necesarios y no hay administración de los objetos en sesión. Tenemos un refrán que dice: ASP.NET Session es como un cerdo: se come todo lo que uno le da. Si desea usar la sesión, sugiero crear una clase proxy que exhiba como propiedades todos los objetos que quiera poner en ella. –

0

Si está utilizando el modo InProc, perderá datos de sesión si el AppPool se recicla, lo que puede suceder una vez al día (de acuerdo con la programación predeterminada) o después de unos 20 minutos de inactividad en el servidor.

En cuanto a las actualizaciones de la página: cada vez que cambie un archivo en el sitio en vivo, existe la posibilidad de que el sitio se reinicie, como si hubiera cambiado web.config. Ciertos archivos no provocarán un reinicio completo, pero no es fácil predecir cuáles, y también depende del modo de compilación que esté utilizando (por lotes o no). Si está utilizando el modo de compilación por lotes predeterminada por carpeta, debería poder cambiar páginas individuales en subcarpetas sin forzar el reinicio. Sin embargo, los cambios en las páginas maestras, el código o los controles pueden provocar un reinicio, al igual que los cambios en la carpeta de nivel superior (dependiendo de qué más tenga allí).

Supongo que debería agregar que cambiar archivos individuales en un sitio en vivo generalmente no es una buena idea, aunque estoy seguro de que tiene sus razones para hacerlo.

+0

Gracias por la información adicional. Puedo ver por qué fue misterioso que ciertos cambios causaron la pérdida de una sesión y otros no. En el tema de las actualizaciones, si quiero hacer pequeños cambios sin cerrar el sitio o interrumpir las sesiones de los usuarios, ¿cuáles son los riesgos de hacer pequeños cambios sobre la marcha (siempre que sepa que no cambian las variables de estado de la sesión) , etc.)? –

+0

Tenga en cuenta que en el modo predeterminado, cuando cambia un archivo, todos los archivos en esa carpeta se volverán a compilar. Durante ese tiempo, los usuarios que intenten acceder a cualquiera de esos archivos tendrán que esperar. Si la carpeta es lo suficientemente grande o si tiene suficientes usuarios tratando de acceder a esos archivos, todos los subprocesos de trabajo se pueden consumir, y todo el sitio puede detenerse hasta que la recompilación finalice. En el peor de los casos, en un sitio ocupado, la cola puede estar tan llena que los usuarios son rechazados con errores de "servidor demasiado ocupado". – RickNZ

Cuestiones relacionadas