none
Concurrencia de Requests con Session RRS feed

  • Pregunta

  • Hola,

    En nuestro proyecto MVC estamos utilizando Session en ciertos casos para mantener las modificaciones temporales hasta que los datos son persistidos de forma definitiva.

    El problema viene cuando con la misma sesión se realiza otra petición al servidor. En este caso, si el primer proceso sigue en curso, la segunda petición no responde hasta que no ha finalizado la primera.

    Si realizamos la misma operación con dos navegadores diferentes en que no se comparta la sesión, aunque la primera petición siga en curso, la respuesta de la segunda petición es inmediata.

    Imagino que el comportamiento en un entorno ASP.NET clásico debe ser el mismo.

    Alguién sabría cuál sería la mejor opción para tratar con este problema?

    Sería necesario implementar un HttpModule personalizado?

    Gracias de antemano,

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.
    miércoles, 13 de julio de 2011 7:59

Respuestas

  • Buenas,

    efectivamente, se trata de una característica de la plataforma ASP.NET que afecta tanto a Webforms como a MVC. El problema es que la primera petición está bloqueando en exclusiva la información de sesión del usuario, por lo que la segunda petición tiene que esperar a que ésta se libere.

    El siguiente texto de MSDN describe tu escenario:

    Solicitudes simultáneas y estado de sesión

    El acceso al estado de sesión de ASP.NET es exclusivo para cada sesión, lo que significa que si dos usuarios diferentes realizan solicitudes simultáneas, se concederá simultáneamente acceso a dos sesiones diferentes.Sin embargo, si se crean dos solicitudes simultáneas para la misma sesión (con el mismo valor de SessionID ), la primera solicitud obtiene el acceso exclusivo a la información de la sesión.La segunda solicitud sólo se ejecuta una vez finalizada la primera.(La segunda sesión también puede obtener acceso si se libera el bloqueo exclusivo de la información porque la primera solicitud supera el tiempo de espera del bloqueo.) Si el valor de EnableSessionState de la directiva @ Page se establece en ReadOnly, una solicitud de la información de sesión de sólo lectura no produce un bloqueo exclusivo de los datos de la sesión.Sin embargo, es posible que las solicitudes de sólo lectura de los datos de sesión aún tengan que esperar a que se libere el bloqueo existente en una solicitud de lectura y escritura para los datos de la sesión.

    Al tratarse de una característica de la plataforma, no creo que puedas evitarla con módulos. Como ves en el texto de MSDN, podrías intentar utilizar Sessionless controllers para lanzar acciones que no utilicen o que sólo consulten las variables de sesión, pero si al final necesitas escribir desde dos peticiones vas a llegar al mismo punto.

    Desde mi punto de vista, la opción más razonable sería no utilizar la sesión para almacenar esa información, sino llevarla a nivel de petición (por ejemplo, serializando los objetos que necesites en un hidden, cookie o algo que puedas ir moviendo entre peticiones). De esta forma, los datos se asociarían a la "conversación" del usuario y no a su sesión, por lo que podrías abrir varias ventanas del mismo navegador y mantener en cada una la información que se necesite sin demasiado problema.

    Saludos!


    José M. Aguilar
    Variable not found
    • Propuesto como respuesta eduard tomàsMVP miércoles, 13 de julio de 2011 10:26
    • Marcado como respuesta JA Reyes miércoles, 13 de julio de 2011 11:59
    miércoles, 13 de julio de 2011 8:29

Todas las respuestas

  • Buenas,

    efectivamente, se trata de una característica de la plataforma ASP.NET que afecta tanto a Webforms como a MVC. El problema es que la primera petición está bloqueando en exclusiva la información de sesión del usuario, por lo que la segunda petición tiene que esperar a que ésta se libere.

    El siguiente texto de MSDN describe tu escenario:

    Solicitudes simultáneas y estado de sesión

    El acceso al estado de sesión de ASP.NET es exclusivo para cada sesión, lo que significa que si dos usuarios diferentes realizan solicitudes simultáneas, se concederá simultáneamente acceso a dos sesiones diferentes.Sin embargo, si se crean dos solicitudes simultáneas para la misma sesión (con el mismo valor de SessionID ), la primera solicitud obtiene el acceso exclusivo a la información de la sesión.La segunda solicitud sólo se ejecuta una vez finalizada la primera.(La segunda sesión también puede obtener acceso si se libera el bloqueo exclusivo de la información porque la primera solicitud supera el tiempo de espera del bloqueo.) Si el valor de EnableSessionState de la directiva @ Page se establece en ReadOnly, una solicitud de la información de sesión de sólo lectura no produce un bloqueo exclusivo de los datos de la sesión.Sin embargo, es posible que las solicitudes de sólo lectura de los datos de sesión aún tengan que esperar a que se libere el bloqueo existente en una solicitud de lectura y escritura para los datos de la sesión.

    Al tratarse de una característica de la plataforma, no creo que puedas evitarla con módulos. Como ves en el texto de MSDN, podrías intentar utilizar Sessionless controllers para lanzar acciones que no utilicen o que sólo consulten las variables de sesión, pero si al final necesitas escribir desde dos peticiones vas a llegar al mismo punto.

    Desde mi punto de vista, la opción más razonable sería no utilizar la sesión para almacenar esa información, sino llevarla a nivel de petición (por ejemplo, serializando los objetos que necesites en un hidden, cookie o algo que puedas ir moviendo entre peticiones). De esta forma, los datos se asociarían a la "conversación" del usuario y no a su sesión, por lo que podrías abrir varias ventanas del mismo navegador y mantener en cada una la información que se necesite sin demasiado problema.

    Saludos!


    José M. Aguilar
    Variable not found
    • Propuesto como respuesta eduard tomàsMVP miércoles, 13 de julio de 2011 10:26
    • Marcado como respuesta JA Reyes miércoles, 13 de julio de 2011 11:59
    miércoles, 13 de julio de 2011 8:29
  • Gracias JM,

    Lo que comentas lo encontré también en este otro enlace, acompañado con una posible solución al problema:

    http://blog.whiletrue.com/2010/09/asp-net-mvc-sessions-and-concurrent-requests-not-what-youd-expect/

    Seguiremos analizando a ver que solución tomamos...

    JA Reyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solución de esta pregunta te ha sido útil.
    miércoles, 13 de julio de 2011 8:34