Question

Un utilisateur a signalé que lorsqu'il utilisait le bouton Précédent pour revenir à une page Web, il revenait en tant que personne différente. Il semble qu'ils puissent accéder à un profil d'utilisateurs différent.

Voici les parties importantes du code:

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

J'utilise des méthodes statiques et un WebProfile statique car je dois utiliser l'objet profile dans un WebMethod statique (ajax pageMethod ). .

  • Cela pourrait-il avoir pour conséquence que l'objet de profil soit "partagé"? par différents utilisateurs?
  • Est-ce que je n'utilise pas correctement les méthodes et les objets statiques?

La raison pour laquelle j'ai changé l'objet WebProfile en un objet statique était parce que je devais accéder à l'objet de profil dans un [WebMethod] (appelé de javascript sur la page).

  • Existe-t-il un moyen d'accéder à un objet de profil dans un [WebMethod] ?
  • Si non, quels sont mes choix?
Était-ce utile?

La solution

Un objet statique est partagé entre toutes les instances d'une application. Par conséquent, si vous modifiez la valeur d'un objet statique, cette modification sera répercutée sur toutes les instances de l'application ayant accès à cet objet. Par conséquent, si votre profil Web est réaffecté par un autre thread (c'est-à-dire qu'un deuxième utilisateur visitant une page) entre vous le définissez pour l'utilisateur actuel, il contiendra des informations différentes de celles que vous attendez.

Pour contourner ce problème, votre code devrait ressembler à:

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

Notez que l'objet statique n'a pas été défini et que la valeur renvoyée doit être affectée à une instance NON STATIC de la classe de profil Web dans votre méthode d'appel.

Une autre option consiste à BLOQUER votre variable statique pendant toute la durée de son utilisation, mais cela entraînera une dégradation importante des performances, car le verrou bloquera toute autre demande concernant la ressource jusqu'à ce que le thread de verrouillage actuel soit terminé - ce n'est pas une bonne chose. chose dans une application web.

Autres conseils

@Geri

Si le profil ne change pas souvent pour l'utilisateur, vous avez la possibilité de le stocker dans l'état actuel de la session. Cela introduira une surcharge de mémoire, mais en fonction de la taille du profil et du nombre d'utilisateurs simultanés, cela pourrait ne pas être un problème. Vous feriez quelque chose comme:

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
}

Pour que l'état du profil soit extrait de la session chaque fois que nécessaire et évite ainsi le besoin de variables statiques.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top