2010-08-18 9 views
50

Tengo una aplicación ASP.net donde los usuarios no pueden completar con éxito ciertas acciones, por razones, supongo, solo pueden estar relacionadas con perder su sesión (que es donde mantengo su usuario actual) información, y cómo determinar si se registran en)Perdiendo estado de sesión

estoy en una pérdida de por qué perderían su sesión, por lo que mi primera pregunta es:

lo que (en general) causaría un usuario perder su sesión en ASP.net?

y puesto que no sé cuando un usuario pierde su sesión y no podrá reproducirla a mí mismo:

¿Cómo puedo realizar un seguimiento cuando el usuario pierde su sesión de

A continuación es mi sessionState config para referencia

<sessionState 
      mode="InProc" 
      cookieless="false" 
      cookieName="My.Site.Com" 
      timeout="480"/> 
+5

Usted podría estar pensando demasiado. Usted declaró que está "asumiendo" que la sesión se está perdiendo. Es posible que esta sea una búsqueda inútil. Tal vez sea mejor analizar la excepción que está recibiendo y tener eso en cuenta. Otras posibilidades incluyen problemas con el uso de una granja de servidores web o clúster. Como el modo de sesión es "InProc", si las conexiones cambian los servidores, el estado de la sesión se perderá. – Russ

+0

Sé que no estoy usando una granja web, estoy seguro de que estoy en una máquina virtual. Debo admitir que solo estoy asumiendo, pero estoy casi 80% seguro de que es el estado de la sesión, y al menos me gustaría seguir suponiendo que es un problema hasta que pueda descartarlo. –

+0

Para mí funcionó agregar una clave de máquina a mi web.config. Hospedo en un alojamiento compartido y este enlace ayuda a crear un local y luego publicarlo. [link] (https://blogs.msdn.microsoft.com/amb/2012/07/31/easiest-way-to-generate-machinekey/) –

Respuesta

98

Varias cosas pueden hacer que el estado de la sesión desaparezca misteriosamente.

  1. Su tiempo de espera ha expirado sessionState
  2. que actualice su web.config o cualquier otro tipo de archivo que hace que su dominio de aplicación para reciclar
  3. Su AppPool en IIS recicla
  4. que actualice su sitio con una gran cantidad de archivos y ASP.NET destruye proactivamente su AppDomain para recompilar y preservar la memoria.

-

Si está utilizando IIS 7 o 7,5, aquí hay algunas cosas a tener en cuenta:

  1. De manera predeterminada, IIS establece AppPools a entregarse después de un periodo de inactividad .
  2. De manera predeterminada, IIS configura AppPools para que se reciclen cada 1740 minutos (obviamente dependiendo de su configuración raíz, pero es la predeterminada)
  3. En IIS, consulte la "Configuración avanzada" de su AppPool. Hay una propiedad llamada "Tiempo de inactividad". Ponlo en cero o en un número más alto que el predeterminado (20).
  4. En IIS, verifique la configuración de "Reciclaje" de su AppPool. Aquí puede habilitar o deshabilitar su AppPool para su reciclaje. La segunda página del asistente es una forma de iniciar sesión en el registro de eventos de cada tipo de Apppool cerrado.

Si está utilizando IIS 6, se aplican las mismas configuraciones (en su mayor parte, pero con diferentes formas de llegar a ellas), sin embargo lograr que registren los reciclados es más problemático.Aquí hay un enlace a una manera de conseguir IIS 6 para registrar eventos de reciclaje apppool:

http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/

-

Si va a actualizar archivos en su aplicación web, usted debe esperar toda la sesión se pierda. Esa es solo la naturaleza de la bestia. Sin embargo, es posible que no espere que ocurra varias veces. Si actualiza 15 o más archivos (aspx, dll, etc.), es probable que tenga varios reinicios durante un período de tiempo, ya que estas páginas son recompiladas por los usuarios que acceden al sitio. Ver estos dos enlaces:

http://support.microsoft.com/kb/319947

http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx

Ajuste del numCompilesBeforeAppRestart a un número más alto (o manualmente rebotar su AppPool) va a eliminar este problema.

-

Siempre se puede manejar Application_SessionStart y Application_SessionEnd para ser notificado cuando se crea o se puso fin a una sesión. La clase HttpSessionState también tiene una propiedad IsNewSession que puede verificar en cualquier solicitud de página para determinar si se crea una nueva sesión para el usuario activo.

-

Por último, si es posible en su circunstancia, he utilizado el SQL Server session mode con buenos resultados. No se recomienda si está almacenando una gran cantidad de datos (cada solicitud carga y guarda la cantidad total de datos de SQL Server) y puede ser una molestia si está colocando objetos personalizados (ya que tienen que ser serializables)), pero me ha ayudado en un escenario de alojamiento compartido donde no pude configurar mi AppPool para no reciclar un par de horas. En mi caso, almacené información limitada y no tuvo un efecto de rendimiento adverso. Agregue a esto el hecho de que un usuario existente reutilizará su SessionID de manera predeterminada y mis usuarios nunca notaron el hecho de que su sesión en memoria se eliminó mediante un reciclaje de AppPool porque todo su estado se almacenó en SQL Server.

+0

Wow ... una lista bastante exhaustiva, ¡gracias! Ha enumerado todo lo que podría pasar por el lado del servidor, ¿hay algo que pueda suceder que dificulte la capacidad de IIS para identificar una solicitud y hacerla coincidir con la sesión adecuada? –

+0

Sí, pero son mucho menos probables. Alguien más mencionado aquí un proxy podría estar destruyendo la cookie de sesión, aunque ningún proxy moderno probablemente haría esto (porque todos los entornos modernos de desarrollo web usan cookies de sesión). He estado revisando esto recientemente en una sola aplicación web un par de veces: primero fue la aplicación de reciclaje, luego las actualizaciones de la página (causadas por> 15 páginas en una actualización). –

+0

¿Cómo puedo configurar IIS en el servidor (no en mi PC local)? –

0

Se podría añadir un poco de registro a la Global.asax en Session_Start y Application_Start para realizar un seguimiento de lo que está pasando con la sesión del usuario y la aplicación como entero.

Además, tenga en cuenta que se está ejecutando en modo Web Farm (múltiples hilos IIS definidos en el grupo de aplicaciones) o balanceo de carga porque el usuario puede terminar golpeando un servidor diferente que no tiene la misma memoria. Si este es el caso, puede cambiar el modo de sesión a SQL Server.

+3

Web Farm no sería un proceso de trabajo múltiple para el grupo de aplicaciones. Eso sería un jardín web. Una granja de servidores web abarcaría varios servidores. –

-1

Su sesión se pierde becoz ....

he encontrado un escenario en el que se pierde la sesión - En una página asp.net, para un campo de cuadro de texto cantidad tiene caracteres no válidos, y seguido por una variable de sesión recuperación para otro propósito.Después de publicar el número inválido que analiza a través de Convert.ToInt32 o duplica una excepción de primera oportunidad, pero el error no aparece en esa línea. En lugar de eso, la sesión es nula debido a una excepción no controlada, muestra un error en la recuperación de la sesión. engañando así la depuración ...

CONSEJO: Pon a prueba tu sistema para que falle- DESTRUCTIVO ... ingresa suficiente basura en escenarios no relacionados por ejemplo: después de los resultados de búsqueda que se muestran ingresa basura en la búsqueda c riterios y los detalles de Goto resultado de la búsqueda ..., que serían capaces de reproducir esta máquina en la base de código local también ... :)

creo que sirve, hydtechie

+0

+1. Muy interesante. Tuvimos exactamente el mismo problema. ¡Un error no controlado al escribir en un archivo de texto provocó que la sesión se borrara! En el módulo de escritura de archivos de texto, ¡no había código para tocar la sesión! –

+0

@SNash - ¿Podrías invitar a votarte ya que las autoridades ciegas lo presionaron ... Fue una experiencia real ...! – HydTechie

2

que estaba teniendo una situación en ASP .NET 4.0 donde mi sesión se restablecería en cada solicitud de página (y mi código SESSION_START se ejecutaría en cada solicitud de página). Esto no le sucedió a todos los usuarios en cada sesión, pero usualmente sucedió, y cuando sucedió, sucedería en cada solicitud de página.

Mi etiqueta web.config sessionState tenía la misma configuración que la mencionada anteriormente.

cookieless="false" 

Cuando cambié a la siguiente ...

cookieless="UseCookies" 

... el problema parecía que se fuera. Aparentemente cierto | falso eran elecciones antiguas de ASP.NET 1. A partir de ASP.Net 2.0, las elecciones enumeradas comenzaron a estar disponibles. Supongo que estas opciones fueron desaprobadas. El valor "falso" nunca ha presentado un problema en el pasado; solo lo he notado en ASP.NET 4.0. No sé si algo ha cambiado en 4.0 que ya no lo admite correctamente.

Además, acabo de descubrir esto no hace mucho tiempo. Dado que el problema era intermitente antes, supongo que aún podría encontrarlo, pero hasta ahora está funcionando con esta nueva configuración.

0

Estaba perdiendo la sesión que no era una cadena o un entero sino un datarow. Colocando los datos en un objeto serializable y guardándolos en la sesión trabajada para mí.

1

En mi configuración de caso AppPool-> AdvancedSettings-> Maximum Worker Proccesos a 1 ayudado.

+0

Genial. me ayuda a resolver el problema – DMishra

0

Tuve un problema con IIS 8 al recuperar contenido a través de Ajax. El problema era que MaximumWorkerProcesses se configuró en 2 y Javascript abrió 17 solicitudes concurrentes. Eso fue más de lo que el AppPool podía manejar y se abrió un nuevo grupo (sin datos de autenticación).

La solución era cambiar MaximumWorkerProcesses a 0 en IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses.

Cuestiones relacionadas