Problemas de sesión aleatorios con ASP.NET 2.0 e IIS 6.0

Bueno, esta es una de esas cosas que pueden volver loco a uno antes de encontrar el motivo que lo está provocando.


Supón que tienes una aplicación Web que funciona de maravilla y que utiliza algunas variables de sesión para guardar datos del usuario (por ejemplo un identificador o cualquier otra cosa). Colocas la aplicación en producción en un servidor Windows 2003 Server y todo parece ir perfecto. El servidor es IIS 6.0 y la aplicación está escrita en ASP.NET 2.0. A medida que la cantidad de peticiones y usuarios crece la aplicación funciona de maravilla y se comporta muy bien, gestionando muchas peticiones por segundo sin problema hasta que de repente un día tienes una llamada…



“Disculpe, soy un usuario de su aplicación y me hoy me ha pasado una cosa muy rara. He entrado con mi clave y nada más hacerlo me han aparecido los datos de otra empresa que no es la mía. Es como si se nos hubiesen cruzado las líneas. ¿no le estará pasando esto a alguien más y verán mis datos, verdad?”


Tragas saliva y tratas de justificar lo que ha pasado echñandole la culpa a los proxies-caché de Telefónica y cosas similares, y crees que te has librado. A los pocos días recibes otra llamda parecida… Y otra más algo después. No son muchas pero el problema parece recurrente y ya te empiezas a “acongojar”. ¿Qué diablos está pasando aquí? Por más que buscas no hay manera de encontrar el origen del problema.


Ya puedes seguir buscando que no lo vas a encontrar…


El problema está en la caché en modo Kernel (núcleo) de IIS 6.0. Apuesto a que es esto lo primero que se te ha pasado por la mente 😉


La caché en modo kernel de IIS 6.0


La caché en modo Kernel de IIS 6.0 es una novedad que apareció con IIS 6.0 en Windows 2003 Server y que está pensada para mejorar enormemente el desempeño del servidor al almacenar copias en memoria de recursos que no necesitan una transición entre el modo kernel y el modo usuario del sistema operativo. El “escuchador” de peticiones en modo Kernel de IIS 6.0 puede recibir una petición, comprobar si el recurso está en caché y devolverlo inmediatamente sin pasar por otros elementos más lentos y sin cambiar de contexto de funcionamiento. para que nos hagamos una idea, sólo con esto IIS 6.0 puede duplicar el rendimiento de páginas ASPX almacenadas en caché respecto a la versión anterior. O sea, que es estupendo.


Ahora vamos a estudiar brevemente cómo se comporta la caché de modo Kernel cuando trabajamos con páginas de ASP.NET 2.0  y éstas, claro está, tienen habilitada algún tipo de caché:




  1. Si la página tiene habilitada la caché total porque hemos especificado únicamente el parámetro VaryByParam=“None“, entonces ASP.NEt envía instrucciones a la caché de modo núcleo para que almacene su contenido. Ello hace que las siguientes peticiones de la misma página mientras dure su vida en la caché se envíen directamente desde ésta. Ello hace que sea un proceso rapidísimo y aumentamos mucho el rendimiento. Luego veremos los problemas que tenemos.


  2. Si se usa algún parámetro “Vary” con otros valores (como el propio VaryByparam o VaryByControl y VaryBycustom) no se usará la caché en modo kernel, sólo una caché “normal” de modo usuario, como en ASP.NET 1.x.

Según lo visto siempre que podamos es mejor usar una caché total para sacar partido a esta característica y así mejorar el rendimiento. Lo que ocurre es que no está exento de problemas.


El primero de ellos es que si actualizamos la página (o ya puestos el gráfico, script o cualqueir otro recurso “cacheado” de este modo) no notaremos el cambio en las peticiones hasta que pase un rato. Incluso aunque borremos un archivo puede que durante bastante tiempo sigamos recibiéndolo en el navegador como si aún existiera. Esto puede ser problemático, es evidente.


Otro problema adicional y menos evidente es que, al devolverse el contenido directamente desde la caché, no interviene para nada ASP.NET, por lo que olvídate de que se lancen eventos de la página. Así que si contabas con anotar algo en la base de datos, realizar cualquier acción al inicializar la página, etc… vete despidiendo pues no funcionará. Interesante ¿no?


Retomemos el problema inicial


Bueno, volvamos ahora veamos qué está pasando en el problema de pérdida de sesión (o más bien “cruce” de sesión) aparentemente aleatorio que se está produciendo en nuestra aplicación.


Todo viene por un “bug” existente en el módulo OutPutCacheModule de ASP.NET. Cuando éste en determinadas ocasiones proporciona a la caché de modo kernel el contenido de una página cacheada totalmente “se olvida” de eliminar del contenido la cabecera HTTP que establece la cookie de sesión del usuario y por lo tanto los siguientes que entran a ver la misma página reciben una copia que incluye dicha cabecera. Si esa página es la primera que éstos reciben del servidor la cabecera se toma como el identificador de sesión nuevo del usuario, reenviándose al servidor en las sigueintes peticiones. Dado que esa cabecera es la forma de identificar (por defecto) las sesiones, se les muestra el contenido del otro usuario. Suena un poco complicado pero así es…


Soluciones


La solución mas evidente es la de no usar nunca páginas cacheadas de manera íntegra. Es decir, trata de usar siempre VarByParam o alguno de los otros parámetros y no sólo el VaryByParam=”None”.


Si no te queda más remedio que usarlo puedes desconectar la caché en modo kernel para tu aplicación. Es muy fácil, sólo tienes que incluir esto en tu web.config:



<httpRuntime enableKernelOutputCache=”false”>


Puedes ver su documentación aquí.


También puedes cortar por lo sano, ser más radical, y desactivar la caché en modo kernel de golpe para todo el servidor. Sólo tienes que tocar el vbalor del registro UriEnableCache, y ya está.


En general no te recomiendo que desactives esta útil característica. Seguro que puedes encontrar otra solución. De todos modos la próxima vez que te encuentres con un problema grave de cruce de sesiones pregúntate a ti mismo “¿estaré usando caché completa en alguna página?”. Si la respuesta es sí casi seguro que has encontrado la solución en este post y me vas a dejar una nota de agradecimiento 🙂

Sin categoría

32 thoughts on “Problemas de sesión aleatorios con ASP.NET 2.0 e IIS 6.0

  1. tengo un problema con las variables de session, cuando estoy en mi aplicacion web de repente se pierden los valores de las variables de session que puedo hacer para solucionar el problema.

  2. EEEEeeehhhhhh 🙂 no sabes cuanto tiempo eh estado con este
    problema, gracias jose pues realize lo que recomendaste
    (modificar el web.config) y se soluciono el problema, de verdad
    que muchas gracias.

    saludos

  3. Hola todos.

    Llevo 2 semanas pegandome con el IIS 6.0, y no hay forma. Basicamente tenemos corriendo una aplicación basada en ajax que lanza peticiones cada n segundos (20, 35..) al servidor. Estas peticiones se hacen en función del usuario que se haya logeado en la aplicación. (NO utilizamos sesiones ASP, las gestionamos internamente). Todo funciona correctamente pero aleatoriamente, puede ser a la hora o a las 10 horas de estas funcionando OK, se cierran todas las sesiones de todos los usuarios. ¿Podría ser debdo a esta cache?

    Saludos.

  4. Hola THBFgc (menudo nick te has buscado):

    Siusaras sesiones propias de ASP.NEt te diría claramente: mira a qué horas o bajo qué condiciones se reciclan el grupo de aplicación de tu aplicación en IIS. Suele ser este elmotivo y mucha gente lo pasa por alto: cuando se recicla el grupo de aplicación lo que pasa es que se descarga el dominio de aplicación y por lo tanto se pierde todos los datos de memoria, o sea, es como si resetearas todo.

    Dado que no sé cómo está hecho vuestro sistema de sesión no sé qué decirte, pero te me apuesto algo a que de todos modos tiene que ver con el reciclaje de grupos de aplicación.

    Una preguntilla: ¿por qué se os ha dado por crear un sistema de sesión propio? ¿Cuál puede ser el motivo para hacer algo así? ¿En qué os habéis basado?
    Me interea saberlo, gracias 🙂

    Saludos,

    JM.

  5. hola a todos.

    tengo un problema con el asp.net 2003 conectado a un sql 2000, lo que pasa es que al implantarlo en el servidor web, pierde la conexion con la base de datos despues de varias operaciones.

    lo que no sucede cuando lo pruebo en la pc de desarrollo.

  6. yo tengo el mismo problema que:
    Emanuel ha opinado:
    – tengo un problema con las variables de session, cuando estoy en mi aplicacion web de repente se pierden los valores de las variables de session que puedo hacer para solucionar el problema.

    Pero te comento como menjeo la session. siemplemente luego del login creo las sessiones asi : session[“nombre”] = miCodigoSession
    y luego las voy consultando en el Page_Init()
    if(session[“nombre”]!=null) que procedea
    else me vote por perdida de session

    lo malo es que no pasa ni 2 minutos y me vota pues las sessiones se pierden 🙁
    que puedo hacer?

  7. excelente informacion
    de primera, estoy seguro que me sera de utilidad cuando este utilizando sitios de ASP.NET por ahora solo programo en PHP y base de datos Access pero en algun momento me dedicare de lleno a aprender ASP:NET y me surgira este problema, lo voy a resolver con prestesa y podre ganarme el respeto de mi jefe.
    Muahcas gracias a todos.

  8. A mi se me reinicia una aplicación web cuando trabajo desconectado de la red de la empresa, o conectado a una vpn. He leido que esto ocurre cuando se sobrescribe algún archivo de la aplicación en tiempo de ejecución

    Alguien sabe como solucionar esto, gracias de antemano

  9. Buen articulo.
    Yo tengo un problema con Windows 2003, tengo una aplicacion web que funciona por unas horas y luego sale aplicacion de servidor no disponible (La aplicacion Web a la que esta intentando obtener acceso en este servidor Web no esta disponible actualmente.nbsp; Presione el boton “Actualizar” del explorador Web para reintentar la solicitud) y ya no funciona. hay q descompartir el directorio web y luego compartir y en el IIS hacer lo mismo con las parametros de autenticacion. puede ser q utiliza en el mism sitio asp1 y asp 2
    Gracias por los consejos

    Luis

  10. Hola!

    Quisiera saber qué solución se podría plantear al problema de las variables de sesión utilizando asp 1.1 y IIS 5.1 en windows 2003 server.

    Yo le coloqué el session.timeout=600 e incluso dentro del IIS tb lo hice, y nada. se siguen perdiendo los valores de las variables de sessión.

    Alguna sugerencia?

  11. Seguramente hay algún elemento intermedio (un software de esos llamados de “seguridad” estilo cortafuegos que nohacen ma´s que dar problemas) que te elimina la cookie de sesión en la cabecera de las peticiones. Tiene toda la pinta de ser algo así.

    Prueba a hacer las sesiones sin cookies (cookieless=true en tu web.config) y a ver si así te funciona.

    Saludos

    JM.

  12. Hola Jose estoy trabajando con ASP.NET 2.0 y con MySQL 5.0 y utilizando AJAX con Anthem y por alguna rzon tambien pierdo el estado de sesion es como si desaparecieran. Localmente si funciona correctamente pero en el hositng no.

    He modificado mi archivo web config y le puse el timeout=”9000″ y nada la sesiones se pieden en segundos.

    Si podrias aconsejarme algo me serivira mucho.

    Saludos

    Giancarlo

  13. No es una aplicación ASP clásica. Es una aplicación ASP.Net hecha en Visual Studio 2003 con Framework 1.1. Hemos seguido todas las directrices que Microsoft nos ha recomendado y sigue sin funcionar Estamos a la espera de que Microsoft nos conteste, ya que hemos abierto un caso hace dos días.

  14. Pues nada, a ver si lo solucionáis. Agradecería mucho que cuando lo tengáis listo nos diéses la solución aquí, y así compartís conocimiento con nosotros ¿ok? 🙂

    Saludos

    JM.

  15. Muy buen articulo Jose M. Alarcon, yo tengo un problema parecido al de los otros post, tengo un chat en un sitio y utilizo variables de Session y Applicacion, las cuales se inicializan de repente y no se que lo esta ocasionando, me podrias hablar mas acerca del reciclado de variables que comentas en uno de tus post y como configurarlo
    Gracias.

  16. hola las siglas ASP corresponde a Asociated Sobrestation Programmer y fue fundada en 1980 por un carpintero que encontro la mnera de hacer con muy pocas lineas de codigo un sistema capaz de hackear el banco de rodas. Ahora esta tecnologia fue adquirida por un directivo de Microsoft y actualmente se utiliza para confeccion de sistemas de plaza y titeres, administracion de consorcios y doblecacion de paralesas.

    El carpintero fue inmediatamente encarcelado y su familia ingresada a un plan de proteccion de testigos, se cree que viven en el Tibet en un iglu.

    Espero que le haya servido la informacion, a mi me sirvio para ganar el primer puesto en un concurso de preguntas y respuestas en la la TV AZTK del DF..

  17. Hola José Manuel, Realice los cambios como se indican. Puse en el web.config lo siguiente:

    lo que no se si esto es suficiente o falta algo más. Ya que pense que no volvería a pasar, sin embargo me acaba de suceder nuevamente.

    Te agradezco de antemano tu apoyo.

    Atte

    Juan

  18. Tengo el mismo problema que varios.. las sessiones por algún motivo su valor se va ha NULL y la aplicación no funciona correctamente.

    Que solución existe para ello…??

  19. tengo instalado IIS 6.0 con ASP.net , tengo un problema que al iniciar con el nombre de la pagina tienes problemas en las pestanas y comportamientos extranos, y al acceder con la IP funciona perfectamente, que podra estar pasando///

  20. Bueno, lo primero es verificar en todo el codigo si por error estas anulando la sesion

    por ejemplo en algun lugar en lugar de poner
    this.session[laVariable] != null) estas poniendo
    this.session[laVariable] = null

    Yo he trabajado con sessiones años y nunca se me han perdido excepto cuando por error en mi codigo las asigno un valor nulo.

    Las sessiones suelen cruzase cuando. abres la aplicacion y se logea el usuario 1, en I. explorer das archivo-nueva-ventana y te logeas con usuario2.

    si haces eso se mezclan las sessiones.

  21. Hola D. Arturo:

    Dudo que actualizando el navegador solucionaras el problema porque esto es un problema de SERVIDOR, no de lado cliente, así que el navegador no tiene nada que ver. Seguramente era otro tipo de problema y te pareció que se solucionaba con esa actualización, pero no era este problema.

    Saludos

    JM

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *