c# asp.net session-state httphandler

c# - IRequiresSessionState vs IReadOnlySessionState



asp.net session-state (3)

¿Cuál es la diferencia entre IRequiresSessionState e IReadOnlySessionState junto a la incapacidad del segundo para guardar los cambios en las variables de sesión?

Ambos me brindan la capacidad de acceder a las variables de sesión en mi HttpHandler . Pero, ¿por qué preferiría IReadOnlySessionState ? Simplemente me impide guardar la sesión para la siguiente solicitud.
¿O me da una ventaja de rendimiento sobre IRequiresSessionState ?

¿Cuándo preferiría usar IReadOnlySessionState en lugar de IRequiresSessionState ?


Esa interfaz controla si el marco guardará el estado de la sesión actual al final de la solicitud. Hace una gran diferencia cuando utiliza el almacenamiento de estado de sesión fuera de proceso. En ese caso, sin la interfaz, el sistema seguirá almacenando los datos de la sesión en la base de datos remota, incluso cuando no haya cambiado (el sistema no realiza un seguimiento de si los datos de la sesión se modificaron durante la solicitud). Cuando utiliza la interfaz IReadOnlySessionState, se omite la fase de reescritura.



Una diferencia crítica es que IRequiresSessionState pone un bloqueo exclusivo en la sesión actual, lo que potencialmente limita el número de solicitudes concurrentes del usuario actual. (Para obtener más información sobre este fenómeno de bloqueo, consulte ¿Es posible forzar la concurrencia de solicitudes cuando se utilizan sesiones ASP.NET? )

Por el contrario, IReadOnlySessionState no adquiere un bloqueo exclusivo.

Esto es lo mismo documentado en la útil respuesta de Renad a una pregunta SO casi idéntica .

La mejor documentación oficial que he encontrado para esto proviene de los proveedores de estado de sesión del artículo de MSDN:

Tres de los métodos más importantes en un proveedor de estado de sesión son GetItem, GetItemExclusive y SetAndReleaseItemExclusive. SessionStateModule llama a los dos primeros para recuperar una sesión del origen de datos. Si la página solicitada implementa la interfaz IRequiresSessionState (de forma predeterminada, todas las páginas implementan IRequiresSessionState), el controlador de eventos AcquireRequestState de SessionStateModule llama al método GetItemExclusive del proveedor del estado de sesión. La palabra "Exclusivo" en el nombre del método significa que la sesión debe recuperarse solo si no está siendo utilizada por otra solicitud. Si, por otro lado, la página solicitada implementa la interfaz IReadOnlySessionState (la forma más común de lograr esto es incluir un atributo EnableSessionState = "ReadOnly" en la directiva @ Page de la página), SessionStateModule llama al método GetItem del proveedor. No se requiere exclusividad aquí, ya que SessionStateModule permite la superposición de accesos de lectura.

Tenga en cuenta el paralelo entre el uso explícito de estas interfaces y el uso de la directiva de la página EnableSessionState :

  • EnableSessionState = False <-> no I * SessionState interface
  • EnableSessionState = True <-> IRequiresSessionState interfaz
  • EnableSessionState = ReadOnly <-> IReadOnlySessionState