ASP.NET Maestros: ¿Cuáles son las ventajas / desventajas de usar variables de sesión?


Ya he hecho una búsqueda sobre este tema, y he encontrado los mismos datos una y otra vez a una revisión de los tres tipos diferentes de sesiones. (InProc, Sql, StateServer) Sin embargo, mi pregunta es de una naturaleza diferente.

Específicamente, ¿cuáles son las ventajas/desventajas de usar la sesión. NET incorporada en primer lugar?

Esta es la razón por la que estoy preguntando: Un compañero desarrollador de.NET me ha dicho que NUNCA use la sesión integrada de Microsoft. Para nada. Ni siquiera crear un personalizado Proveedor de Estado de Sesión. Su razonamiento para esto es el siguiente that que si tiene la sesión encendida en IIS hace que todas sus solicitudes sucedan sincrónicamente. Dice que habilitar la sesión degrada el rendimiento de un servidor web.

Su solución para esto es crear una sesión usted mismo a una clase que almacena todos los valores que necesita y se serializa dentro y fuera de la base de datos. Le aconseja que almacene el ID único para hacer referencia a esto en una cookie o en una variable querystring. En nuestro entorno, el uso de una base de datos para almacenar las sesiones es un requisito porque todas las páginas que hacemos están en granjas web, y utilizamos Oracle so así que estoy de acuerdo con esa parte.

¿El uso de la sesión integrada degrada el rendimiento más que una sesión casera? ¿Hay algún problema de seguridad con esto?

Para resumir, ¿cuáles son las ventajas/desventajas?

Gracias a todos los que responden!

Author: MathieuF, 2009-04-28

8 answers

Primero, un navegador solo hará dos solicitudes, a un nombre de host dado, en un momento dado. En su mayor parte, estas solicitudes son para contenido estático (archivos JS, CSS, etc.). Por lo tanto, la serialización de solicitudes a contenido dinámico no es el problema que uno podría pensar. Además, creo que esto puede confundirse con el ASP Clásico, donde las páginas que usan Session definitivamente son serializadas, no creo que este sea el caso con ASP.Net.

Con ASP.Net estado de la sesión (modo SQL, servidor de estado o personalizado) tiene una implementación que es estándar y consistente en toda una aplicación. Si no necesita compartir información de la sesión, esta es su mejor opción. Si necesita compartir información con otros entornos de aplicaciones (php, swing / java, classic asp, etc.) puede valer la pena considerarlo.

Otra ventaja / desventaja es que ha habido una gran cantidad de desarrolladores se centran en la metodología incorporada para las sesiones con respecto al rendimiento, y el diseño sobre el balanceo de su propia, incluso con un proveedor diferente.

 5
Author: Tracker1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:33:04

Mi experiencia ha sido que la sesión es un buen medio para administrar el estado cuando se usa apropiadamente. Sin embargo, muchas veces se usa mal, causando el sentimiento de "nunca uses la sesión" compartido por muchos desarrolladores.

Yo y muchos otros desarrolladores nos hemos encontrado con importantes problemas de rendimiento cuando hemos utilizado erróneamente la sesión para almacenar grandes cantidades de datos de una base de datos, con el fin de "ahorrar un viaje."Esto es malo. Almacenar 2000 registros de usuario por sesión traerá el servidor web a su rodillas cuando más de un par de usuarios utilizan la aplicación. La sesión no debe usarse como caché de base de datos.

Almacenar un entero, sin embargo, por sesión es perfectamente aceptable. Pequeñas cantidades de datos que representan cómo el usuario actual está usando su aplicación (piense en el carrito de compras) es un buen uso del estado de la sesión.

Para mí, realmente se trata de administrar el estado. Si se hace correctamente, la sesión puede ser una de las muchas buenas maneras de administrar el estado. Debe decidirse en el comenzando sobre cómo administrar el estado. La mayoría de las veces, nos hemos encontrado con problemas cuando alguien decide simplemente "lanzar algo en la sesión".

Encontré este artículo es realmente útil cuando se usan modos fuera de proceso, y contiene algunos consejos que nunca habría pensado por mi cuenta. Por ejemplo, en lugar de marcar una clase como serializable, almacenar sus miembros de tipo de datos primitivos en variables de sesión separadas y luego recrear el objeto puede mejorar rendimiento.

 17
Author: Aaron Daniels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:46:45

En primer lugar, su colega está implementando su propio sistema de administración de sesiones respaldado por BD, no veo qué ventaja tiene esto sobre el uso de estado de sesión incorporado almacenado en una base de datos (MS SQL es el predeterminado, no hay razón para no usar Oracle en su lugar).

¿Es su solución mejor que la integrada? Probable. Es mucho más trabajo para ti para empezar. Aquí hay una simple ilustración de por qué. Digamos que utiliza cookies para almacenar su ID, ¿cómo hacer frente a un usuario que desactiva las cookies? Si vosotros habéis utilizado ASP.Net no hay problema, ya que volverá a usar la cadena de consulta. Con la idea de tus colegas tienes que rodar la tuya.

Existe una pregunta muy válida en cuanto a si debe tener el estado de sesión en absoluto. Si puede diseñar su aplicación para que no necesite ningún estado de sesión en absoluto, tendrá un escalado y pruebas de tiempo mucho más fáciles. Obviamente, puede tener estado de la aplicación que necesita vivir más allá de una sesión de todos modos (caso simple beign nombres de usuario y contraseñas), pero usted tiene que almacenar estos datos de todos modos, independientemente de si usted tiene el estado de la sesión.

 7
Author: Steve Haigh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:20:10

La implementación de MS del Estado de sesión no es mala en sí misma... es la forma en que algunos desarrolladores lo utilizan. Como se mencionó anteriormente, el uso del proveedor de estado de sesión integrado significa que no tiene que reinventar los problemas de seguridad, envejecimiento y concurrencia. Simplemente no empieces a atascar mucha basura en la sesión porque eres demasiado perezoso para encontrar una mejor manera de administrar las transiciones de estado y de página. La sesión no escala muy bien... si cada usuario en su sitio stuffs un montón de objetos en el sesión, y esos objetos ocupan un poco de la memoria finita disponible para su aplicación, se encontrará con problemas más pronto que tarde a medida que su aplicación crezca en popularidad. Use la sesión de la manera para la que fue diseñada: un token para representar que un usuario todavía está "usando" su sitio. Cuando empiezas a aventurarte más allá de eso, ya sea por ignorancia o pereza, estás obligado a quemarte.

 6
Author: ProKiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:21:41

Debe ser juicioso en su uso de la sesión, ya que las solicitudes múltiples al mismo objeto de sesión generalmente se pondrán en cola: consulte "Solicitudes simultáneas y estado de la sesión" http://msdn.microsoft.com/en-us/library/ms178581.aspx .

Tenga en cuenta que puede establecer EnableSessionState a ReadOnly para permitir el acceso de lectura concurrente al estado de la sesión.

Esta cola es algo bueno, ya que significa que los desarrolladores pueden usar la sesión sin preocuparse por la sincronización.

No lo haría de acuerdo con la recomendación de su colega de "nunca" usar Sesión y ciertamente no consideraría rodar la mía.

 6
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-18 17:19:01

¿Hay algún problema de seguridad con esto?

Si lanzas el tuyo tendrás que manejar la Fijación de Sesión y los ataques de Secuestro, mientras que usando la Sesión incorporada creo que se manejan por ti (pero podría estar equivocado).

 3
Author: Tom Ritter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:10:44

La sesión hecha en casa como usted ha descrito no está haciendo nada diferente "SQL" estado de sesiones.Net y en mi experiencia no creo que la sesión degrada su rendimiento en todos modos. la construcción de su propio administrador de sesiones requerirá poner en varias otras tareas de plomería a lo largo de - seguridad, enjuagarlo, etc.

La ventaja con las sesiones integradas es su fácil de usar con toda esta plomería ya se ha cuidado. con el modo" SQL " puede conservar los datos de la sesión en la base de datos lo que le permite ejecutar su aplicación en granjas web sin ningún problema.

Diseñamos una aplicación de comercio electrónico b2b para la empresa fortune 57 que procesa más de 100 mil transacciones al día y utiliza sesiones [modo SQL] bastante extensivamente sin ningún problema en absoluto.

 3
Author: Vikram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 18:14:00

Corrígeme si me equivoco:

La principal ventaja de almacenar el estado de la sesión en una base de datos, por ejemplo, SQL Server, es que no está consumiendo recursos de memoria, sino que los almacena en el disco en una base de datos.

La desventaja es que toma un golpe de IO para recuperar esta información de la base de datos cada vez que la necesita (o tal vez SQL Sever incluso hace algún almacenamiento en caché mágico de los datos para usted basado en consultas ejecutadas recientemente?)

En cualquier caso, este es el precio de un IO para recuperar la sesión la información de una base de datos por viaje al servidor web parece una estrategia más segura para los sitios que encuentran mucho tráfico.

 2
Author: ChadD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-28 19:51:31