none
Objetos en sesion parecen estar ligados RRS feed

  • Pregunta

  • Buenas

    Estoy tratando de guardar informacion en un objeto que subo a sesion, a su vez tengo una lista de este mismo objeto que  funciona como un historial, pero tengo un problema, el objeto que guardo en sesion parece que actualiza el objeto de la lista como si estubieran ligados, en en la primera imagen tengo el objeto que esta en el historial antes de modificar el objeto al que parece estar ligado

    obtengo el model y lo actualizo

    if ( null != model )
                {
                    model.CodOpcSel = codOpcSel;
                    model.CodDatoOpcSel = codDatoOpcSel;
    
                    CargaAsistenteBeneficioViewModel(model);
                }

    cuando hago el breakpoint sobre la linea model.CodOpcSel = codOpcSel el modelo que tengo en la lista historial se cambia, aun sin haber actualizado la sesion

    Mi programa consiste en un asistente por pasos de cada pasos se obtiene informacion, entonces en cada paso guardo esa informacion en sesion y al final guardarla, no se si es la mejor manera de ir guardando la informacion en sesion en cada paso.

    Saludos



    Cesar

    domingo, 11 de junio de 2017 1:58

Respuestas

  • El comportamiento es distinto según que en el web.config configures la sesión para que sea local ("InProc" es el modo por defecto), o sea remota ("SqlServer" o "StateServer" o "Custom"). Cuando es local (que seguramente es como la tienes), los objetos tipo-referencia se guardan por referencia, por lo que quedan "ligados" como tú dices. En cambio cuando la sesión es remota, los objetos que guardas en el Session se serializan (lo cual requiere que sean serializables, sino se produce un error) y se salvan en el almacenamiento remoto, por lo que en ese caso NO quedan ligados.

    Así que, si quieres que tu aplicación una vez pasada a producción se pueda configurar con cualquier tipo de sesión (por ejemplo, puede que se requiera pasarla a remoto si despliegas sobre una Granja), entonces conviene que te cerciores de que todo lo que metes en el Session es serializable, y que no confíes en que permanezca ligado o no ligado. Una forma de forzar que "no se ligue" es la que ya has descubierto: tomar un clon del objeto y salvar el clon en lugar del objeto original.

    • Marcado como respuesta CesarChavezNava domingo, 11 de junio de 2017 17:28
    domingo, 11 de junio de 2017 7:34

Todas las respuestas

  • Creo que no analice bien la situacion ya que ese objeto apuntra al mismo de la lista, simplemente agregue un metodo que clona el objeto cuando lo recupero de sesion y este lo agrego al historial de esta manera ya no es el mismo objeto

    Cesar

    domingo, 11 de junio de 2017 2:52
  • El comportamiento es distinto según que en el web.config configures la sesión para que sea local ("InProc" es el modo por defecto), o sea remota ("SqlServer" o "StateServer" o "Custom"). Cuando es local (que seguramente es como la tienes), los objetos tipo-referencia se guardan por referencia, por lo que quedan "ligados" como tú dices. En cambio cuando la sesión es remota, los objetos que guardas en el Session se serializan (lo cual requiere que sean serializables, sino se produce un error) y se salvan en el almacenamiento remoto, por lo que en ese caso NO quedan ligados.

    Así que, si quieres que tu aplicación una vez pasada a producción se pueda configurar con cualquier tipo de sesión (por ejemplo, puede que se requiera pasarla a remoto si despliegas sobre una Granja), entonces conviene que te cerciores de que todo lo que metes en el Session es serializable, y que no confíes en que permanezca ligado o no ligado. Una forma de forzar que "no se ligue" es la que ya has descubierto: tomar un clon del objeto y salvar el clon en lugar del objeto original.

    • Marcado como respuesta CesarChavezNava domingo, 11 de junio de 2017 17:28
    domingo, 11 de junio de 2017 7:34