Pregunta

Estoy seguro de que he cometido algunos errores terriblemente obvios que simplemente no puedo ver. Espero que alguno de ustedes me pueda aclarar.

I la administración de mi sesión funciona perfectamente, excepto que si un usuario en una máquina ingresa datos, un usuario que inicia una sesión en otra máquina también recuperará la información de la sesión de la primera. No tan bien. :(

Llamo a mis sesiones así:

UserInfo userinfo = UserInfo.Session;

Mi clase mgt de sesión usa esto:

static UserInfo userInfo;

static public UserInfo Session
{
    get
    {
        if (userInfo == null)
        {
            userInfo = new UserInfo();
            userInfo.ResetSessionTime();
        }
        return userInfo;
    }
}

Leo y escribo los datos así. Me doy cuenta de que podría serializar toda la clase, pero parece mucho más sobrecarga serializar y deserializar una clase completa cada vez que se llama a la clase, en lugar de simplemente tomar uno o dos elementos que necesito.

Decimal _latitude;
private String SessionValue(String sKey, String sValue, String sNewValue)
    {
        String sRetVal = "";
        if (sNewValue == null)//not wanting to update anything
        {
            if (sValue == null)//there is no existing value
            {
                sRetVal = (String)System.Web.HttpContext.Current.Session[sKey];
            }
            else
            {
                sRetVal = sValue;
            }
        }
        else
        {
            System.Web.HttpContext.Current.Session[sKey] = sNewValue;
            sRetVal = sNewValue;
        }
        return sRetVal;
    }



    public Decimal Latitude
    {
        get { return SessionValue("Latitude", _latitude); }
        set { _latitude = SessionValue("Latitude", _latitude, value); }
    }

Gracias por tu ayuda

¿Fue útil?

Solución

1) Está utilizando estadísticas para su UserInfo, lo que significa que se comparte una sola instancia de esta clase entre todas las solicitudes que llegan a su servidor web.

2) No solo está almacenando valores en la sesión (que no se comparte entre los usuarios) sino también en una variable de instancia, que en este caso se compartirá entre los usuarios.

Entonces, el valor de _latitude le está causando este problema. Una solución simple es esta:

public class Userinfo
{
    public Decimal Latitude
    {
        get { return System.Web.HttpContext.Current.Session["Latitude"]; }
        set { System.Web.HttpContext.Current.Session["Latitude"] = value; }
    }
}

Una versión mejor y más comprobable sería:

public class UserInfo
{
    private HttpSessionStateWrapper _session;
    public UserInfo(HttpSessionStateWrapper session)
    ( 
       // throw if null etc
       _session = session;
    )

    public Decimal Latitude
    {
        get { return _session["Latitude"]; }
        set { _session["Latitude"] = value; }
    }
}

En la segunda instancia, dentro de una solicitud, simplemente construye una nueva instancia de HttpSessionStateWrapper (utilizando la sesión actual) y páselo a la instancia de UserInfo. Cuando realice la prueba, puede pasar una envoltura simulada.

No importa qué, la instancia de UserInfo no debe compartirse entre sesiones y debe escribir y leer directamente desde la sesión. No intente optimizar las cosas prematuramente manteniendo versiones locales de los valores de su sesión. No está ahorrando tiempo y simplemente se está abriendo a los errores.

Otros consejos

Esto sucede porque almacena su información de usuario en un campo estático. Las instancias estáticas se comparten entre todas las solicitudes y duran toda la vida útil de su aplicación.

En otras palabras, todos sus usuarios obtendrán la misma instancia de UserInfo de UserInfo.Session.

Para solucionar esto, podrías:

  • Serializar toda la clase en sesión. No sé qué otras propiedades tiene, pero supongo que no sería una sobrecarga.
  • Cree una instancia de UserInfo por solicitud, de modo que el usuario siempre lea desde una nueva instancia, que a su vez actualizará sus valores de la sesión.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top