2010-05-16 21 views
16

¿Existe algún tipo de limitación de tamaño de sesión o valor aconsejable para no superar?Limitación de tamaño de sesión ASP.NET

En mi aplicación web creo algunas tablas de datos para almacenar selecciones de usuarios que se almacenan en sesión hasta que el usuario aprueba las selecciones, por lo que agrego esos valores a la base de datos.

El problema es que no sé si la sesión es lo suficientemente confiable como para mantener pocos objetos dentro o no?

Gracias!

más información

tamaño de la sesión es de aproximadamente 10-20KB máx.

+2

In-proc or out proc? – Liam

Respuesta

7

Sí, es confiable suficiente. Simplemente no es muy escalable, así que planee con anticipación. Esto se detendrá por completo cuando lo ejecute en más de 1 servidor.
Y hay una especie de límite: Número de concurrentes: los usuarios * SizeOf-Sesión < Disponible-Mem

Depende, por supuesto, del tamaño de las mesas, el almacenamiento de unos pocos KB es generalmente aceptable (aunque alto los sitios de tráfico intentarán mantenerlo más pequeño).

Si sus usuarios pueden compartir tablas, puede colocar esos datos en el objeto Aplicación, un gran ahorro.

Y un objeto de sesión está limitado a la configuración TimeOut, el valor predeterminado es 20 min. Una manera de optimizar el consumo de memoria es reducir eso, pero eso es una compensación con la conveniencia del usuario.

+1

gracias, entonces ¿no hay límites de tamaño especiales? Necesito almacenar allí algunos kbs por usuario. Pocas tablas pequeñas, por lo tanto ... La sesión está fuera de proceso y el tiempo de espera es bastante grande. Los datos se almacenan hasta que el usuario termine el formulario ... Así que no es necesario esperar mucho tiempo. – eugeneK

+0

Pensé usar ViewState en su lugar, pero el estado de la vista ya es lo suficientemente grande para que al menos algunos datos provengan del servidor y algunos de los datos de la página. – eugeneK

+8

Un límite obvio en los grupos de aplicaciones de 32 bits es el uso de la memoria virtual total de 1.3 GB, y debe asegurarse de que sus sesiones no consuman demasiado. –

1

Siempre debe suponer que la sesión es un almacenamiento muy valioso y muy limitado. El consumo debe ser lo mínimo posible, ya que nunca se sabe cuántos usuarios admitirá la aplicación.

DataTable puede ser demasiado grande para almacenar en sesiones, a menos que se pueda mantener lo suficientemente pequeño.

+2

gracias, pero sé que Necesito tamaño, al menos algunas reglas básicas. No tan pequeño como sea posible. – eugeneK

2

Supongo que está teniendo la sesión almacenada en modo "inProc". En este modo, la sesión de las aplicaciones ASP.NET, el caché, etc. se almacenan en la RAM del servidor web (a través del proceso aspnet_wp.exe). Y .NET no puede usar todo. Hay una configuración en machine.config que indica el límite de umbral (por defecto 60%). Una vez que se alcanza este umbral, IIS reciclará el proceso de trabajo y se perderá toda la información de la sesión.

Tenga en cuenta que, si su servidor aloja más de una aplicación asp.net, todas las aplicaciones compartirán el 60% de la memoria. Entonces, si el uso acumulativo de memoria alcanza el umbral, el proceso de trabajo aún se recicla.

Alternativamente a esto, además de optimizar su aplicación para usar la sesión con moderación, es configurar la aplicación para usar la sesión en modo fuera de proceso (usando un servidor de estado o un servidor sqlserver para almacenar información de sesión).

El modo fuera de proceso puede reducir el rendimiento del sistema.

Consulte el artículo this para obtener más información sobre Session State Management.

10

He aquí algunas notas sobre el estado de sesión:

  • InProc estado (mode="InProc") sesión se limita a la cantidad de memoria disponible para el proceso de trabajo. Solo se almacenan las referencias de objeto, no los objetos mismos.

Fuera de gestión estatal proceso serialises objetos antes de que persiste ellos:

  • Fuera de la administración del estado del proceso mediante el servidor de estado de sesión (mode="StateServer") se limita a la cantidad de memoria disponible para el servicio de estado.

  • La gestión de estado fuera de proceso con SQL Server (mode="SQLServer") está limitada solo por el tamaño máximo del tipo de datos SQL image o el tamaño máximo permitido de la base de datos.

Obviamente todavía tiene que haber suficiente memoria disponible para el proceso de trabajo para poder tirar de un cabo del objeto de sesión de nuevo en la memoria y re-hidratar durante la duración de la petición HTTP.

Como ya he mencionado anteriormente, fuera del proceso de gestión del estadoserialises objetos antes de que persiste ellos.

Esto significa que los objetos deben ser serialisable que excluye, por ejemplo, XmlDocument o cualquier cosa que se hereda de MarshalByRef.

El intento de serializar los objetos de este tipo tendrá como resultado la siguiente excepción:

No puede serializar el estado de la sesión. En el modo 'StateServer' y 'SQLServer', ASP.NET serializará los objetos de estado de sesión, y, como resultado, los objetos no serializables o los objetos MarshalByRef están no permitidos. La misma restricción se aplica si la serialización similar es realizada por el almacén de estado de sesión personalizado en el modo 'Personalizado'.

+2

¿Cómo responde esto la pregunta? – Liam

+1

¿Qué está * limitado a la cantidad de memoria disponible para el servicio estatal * que se supone que significa? – Liam

+0

@Liam - OP claramente no se ha leído en la administración del estado de la sesión. Estoy explicando las opciones disponibles, ¿eso es algo tan malo, expandir el conocimiento de OP con la misma información relevante del tema? Por segunda pregunta. El servicio de estado es un servicio fuera de proceso, persiste el estado de la sesión en la memoria (no en el disco o en una base de datos SQL) por lo que estará limitado por la cantidad de memoria disponible como proceso, esto es importante si está ejecutando un servicio de estado de 32 bits en una máquina con potencialmente otras presiones de memoria. – Kev