Frage

Ich habe einen Benutzer berichtet, dass, wenn sie die Zurück-Taste verwenden, um eine Web-Seite zurückzugeben, die sie zurück, als eine andere Person kommen. Es scheint so, können sie ein anderes Benutzer-Profil zugreifen.

Hier sind die wichtige Teile des Codes:

//here's the code on the web page

public static WebProfile p = null;

protected void Page_Load(object sender, EventArgs e)
{
    p = ProfileController.GetWebProfile();
    if (!this.IsPostBack)
    {
         PopulateForm();
    }       
}

//here's the code in the "ProfileController" (probably misnamed)
public static WebProfile GetWebProfile()
{
    //get shopperID from cookie
    string mscsShopperID = GetShopperID();
    string userName = new tpw.Shopper(Shopper.Columns.ShopperId,        mscsShopperID).Email;
    p = WebProfile.GetProfile(userName); 
    return p;
}

Ich bin mit statischen Methoden und static WebProfile, weil ich das Profil Objekt in einem static WebMethod (Ajax pageMethod) verwenden muß.

  • Könnte das Kabel mit dem Profilobjekt von verschiedenen Benutzern „geteilt“ werden?
  • Bin ich statische Methoden nicht verwenden und Objekte korrekt?

Der Grund, warum ich WebProfile Objekt zu einem static Objekt geändert wurde, weil ich das Profil Objekt innerhalb eines [WebMethod] zugreifen muß (von Javascript auf der Seite genannt).

  • Gibt es eine Möglichkeit, ein Profil Objekt innerhalb eines [WebMethod] zugreifen?
  • Wenn nicht, welche Möglichkeiten habe ich?
War es hilfreich?

Lösung

Ein statisches Objekt in allen Instanzen einer Anwendung freigegeben ist so, wenn Sie den Wert eines statischen Objekts ändern, wird diese Änderung in allen Instanzen der Anwendung, die das Objekt zugreifen widerspiegelt. Deshalb, wenn Sie Ihre Web-Profil von einem anderen Thread (das heißt ein zweiter Benutzer den Besuch einer Seite) zugewiesen wird Inbetween Sie es für den aktuellen Benutzer einstellen, es erwarten Sie Informationen unterschiedlich zu dem, was enthalten wird.

Um diesen Code erhalten soll, wie etwas aussehen:

public WebProfile p = null;

protected void Page_Load(object sender, EventArgs e)
{
    p = ProfileController.GetWebProfile();
    if (!this.IsPostBack)
    {
         PopulateForm();
    }       
}

public static WebProfile GetWebProfile()
{
    //get shopperID from cookie
    string mscsShopperID = GetShopperID();
    string userName = new tpw.Shopper(Shopper.Columns.ShopperId,        mscsShopperID).Email;
    return WebProfile.GetProfile(userName); 
}

Beachten Sie, dass das statische Objekt nicht gesetzt worden ist und der zurückgegebene Wert sollte in Ihrem Rufmethode zu einer nicht STATIC Instanz der Web-Profilklasse zugeordnet werden.

Ein andere Möglichkeit ist Ihre statische Variable für die gesamte Zeit auf LOCK es in Gebrauch ist, aber dies zu starken Verschlechterung der Leistung als das Schloss führt alle andere Anforderungen für die Ressource blockiert, bis die aktuellen Sperrgewinde abgeschlossen sind - keine gute was in einem Web-App.

Andere Tipps

@Geri

Wenn das Profil nicht oft für die Sie die Möglichkeit, Benutzer ändern es in dem aktuellen Sitzungsstatus zu speichern. Dies wird einige Speicher-Overhead einführen, aber abhängig von der Größe des Profils und der Anzahl der gleichzeitigen Benutzer könnte dies auch kein Thema sein. Sie würden so etwas wie:

public WebProfile p = null;
private readonly string Profile_Key = "CurrentUserProfile"; //Store this in a config or suchlike

protected void Page_Load(object sender, EventArgs e)
{
    p = GetProfile();

    if (!this.IsPostBack)
    {
        PopulateForm();
    }       
}

public static WebProfile GetWebProfile() {} // Unchanged

private WebProfile GetProfile()
{
    if (Session[Profile_Key] == null)
    {
        WebProfile wp = ProfileController.GetWebProfile();
        Session.Add(Profile_Key, wp);
    }
    else
        return (WebProfile)Session[Profile_Key];
}

[WebMethod]
public MyWebMethod()
{
    WebProfile wp = GetProfile();
    // Do what you need to do with the profile here
}

Damit das Profil Zustand von Sitzung abgerufen wird, wenn notwendig, und um die Notwendigkeit von statischen Variablen bekommen sollte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top