¡Acabo de descubrir que cada solicitud en una aplicación web ASP.Net obtiene un bloqueo de sesión al comienzo de una solicitud, y luego la libera al final de la solicitud!
En caso de que las implicaciones de esto se pierdan para usted, como lo fue para mí al principio, esto básicamente significa lo siguiente:
Cada vez que una página web ASP.Net tarda mucho en cargarse (tal vez debido a una llamada lenta a la base de datos o lo que sea), y el usuario decide que quiere navegar a una página diferente porque está cansado de esperar, ¡NO PUEDEN! El bloqueo de sesión ASP.Net obliga a la nueva solicitud de página a esperar hasta que la solicitud original haya finalizado su carga lenta y dolorosa. Arrrgh
Cada vez que UpdatePanel se carga lentamente, y el usuario decide navegar a una página diferente antes de que UpdatePanel haya terminado de actualizarse ... ¡NO PUEDEN! El bloqueo de sesión de ASP.net obliga a la nueva solicitud de página a esperar hasta que la solicitud original haya finalizado su carga lenta y dolorosa. Doble Arrrgh!
Así que cuales son las opciones? Hasta ahora se me ocurrió:
- Implemente un SessionStateDataStore personalizado, que ASP.Net admite. No he encontrado demasiados para copiar, y parece de alto riesgo y fácil de estropear.
- Realice un seguimiento de todas las solicitudes en curso y, si llega una solicitud del mismo usuario, cancele la solicitud original. Parece un poco extremo, pero funcionaría (creo).
- ¡No uses la sesión! Cuando necesito algún tipo de estado para el usuario, podría usar Cache en su lugar y elementos clave en el nombre de usuario autenticado, o algo así. Nuevamente parece un poco extremo.
¡Realmente no puedo creer que el equipo de ASP.Net Microsoft hubiera dejado un enorme cuello de botella de rendimiento en el marco en la versión 4.0! ¿Me estoy perdiendo algo obvio? ¿Qué tan difícil sería usar una colección ThreadSafe para la sesión?