Frage

Ich bin sicher, dass ich etwas schmerzhaft offensichtlich Fehler gemacht habe (n), dass ich einfach nicht sehen. Ich hoffe einer von euch mir gerade einstellen.

ich meine Session-Management ist perfekt funktioniert, außer dass, wenn ein Benutzer auf einer Maschine gibt Daten, einen Benutzer, der eine Sitzung auf einem anderen Gerät beginnt auch die Sitzungsinformationen aus dem ersten retreive. Nicht so gut. : (

Ich nenne meine Sitzungen wie folgt aus:

UserInfo userinfo = UserInfo.Session;

Meine Sitzung mgt-Klasse verwendet diese:

static UserInfo userInfo;

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

Ich habe gelesen, und die Daten so schreiben. Ich weiß, dass ich die ganze Klasse serialisiert werden könnte, aber es scheint, wie viel mehr Aufwand jedes Mal eine ganze Klasse zu serialisiert und deserialisiert die Klasse genannt wird, im Gegensatz zu nur die ein oder zwei Punkte packte ich brauche.

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); }
    }

Danke für Ihre Hilfe

War es hilfreich?

Lösung

1) Sie verwenden Statik für Ihre Userinfo, was bedeutet, dass eine einzelne Instanz dieser Klasse unter allen Anfragen gemeinsam genutzt wird, um Ihren Web-Server kommen.

2) Sie sind nicht nur Werte in der Sitzung zu speichern (die von Benutzern gemeinsam genutzt wird nicht), sondern auch in einer Instanzvariablen, die in diesem Fall von Benutzern gemeinsam genutzt werden.

So ist der Wert von _latitude verursacht dieses Problem. Eine einfache Lösung ist folgende:

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

Eine bessere, testbare Version wäre:

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; }
    }
}

In der zweiten Instanz, die in einer Anforderung konstruieren Sie nur eine neue Instanz des HttpSessionStateWrapper (die aktuelle Sitzung verwendet wird) und es an die Userinfo-Instanz übergeben. Wenn Sie testen, können Sie nur in einem Mock-Wrapper übergeben.

Egal was passiert, soll die Userinfo-Instanz nicht unter Sitzungen gemeinsam genutzt werden, und es sollte direkt aus der Session schreiben und lesen. Versuchen Sie nicht zu früh, um die Dinge zu optimieren, indem lokale Versionen Ihrer Sitzungswert zu halten. Sie sind nicht zu jeder Zeit zu sparen und Sie öffnen sich nur um Fehler auf.

Andere Tipps

Dies geschieht, weil Sie in einem statischen Feld Benutzer info speichern. Statische Instanzen werden zwischen allen Anfragen geteilt und lebt die gesamte Lebensdauer Ihrer Anwendung.

Mit anderen Worten, alle Benutzer die gleiche Userinfo-Instanz aus UserInfo.Session erhalten.

Um dies zu beheben, können Sie:

  • serialisiert die ganze Klasse in der Sitzung. Ich weiß nicht, welche andere Eigenschaften, die Sie haben, aber ich würde vermuten, wäre es nicht zu viel von einem Overhead.
  • Erstellen Sie eine Instanz von Userinfo pro Anfrage, so dass der Benutzer immer von einer neuen Instanz liest, was wiederum es Werte von Session aktualisieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top