Pregunta

He leído algunos enfoques para almacenar viewstate en el servidor:

Aquí hay uno

Aquí es otro

Pero son algo complicados. Estoy buscando una forma de persistir un objeto sin tener que serializarlo. Podría usar el estado de sesión, pero si un usuario abre más de una ventana, podría sobrescribir el objeto.

¿Hay una solución simple para esto?

¿Fue útil?

Solución

En esta situación, guardaría el objeto en la sesión usando una clave única y vincularía la clave a la página. Todo esto se puede resumir en propiedades en la clase de página.

public string PersistanceKey
{
    get { 
        if(ViewState["PersistanceKey"] == null)
           ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();

        return (string)ViewState["PersistanceKey"];
    }
}

public PersistanceObject Persistance
{
    get {
        if(Session[this.PersistanceKey] == null)
            Session[this.PersistanceKey] = new PersistanceObject();

        return (PersistanceObject)Session[this.PersistanceKey];
}

Las diferentes claves de sesión permitirían diferentes objetos por página. Alternativamente, en lugar de usar el objeto Session, podría considerar usar el caché de la aplicación (el objeto Cache) para eliminar automáticamente las entradas obsoletas de la memoria, pero esto tiene sus propias advertencias.

Cabe señalar que las advertencias de Joel sobre su respuesta sobre el uso de la memoria son completamente precisas. Esta podría no ser la mejor idea para escenarios con poca memoria, alto uso o objetos de gran persistencia.

Otros consejos

  

Estoy buscando una forma de persistir un objeto sin tener que serializarlo.

Ten cuidado con eso. Esto tendrá un impacto dramático en el uso de la memoria de su sitio, y el uso de la memoria es a menudo el mayor impedimento para la escalabilidad.

Asigne un número a cada ventana que el usuario pueda abrir. Agregue ese número a la clave de sesión. También debe almacenar el número en algún lugar de la página (cadena de consulta o una entrada oculta) para poder recuperar la variable de sesión adecuada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top