Domanda

Ho un utente che riferisce che quando usano il pulsante Indietro per tornare a una pagina Web, tornano come un'altra persona. Sembra che stiano accedendo a un profilo utente diverso.

Ecco le parti importanti del codice:

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

Sto usando metodi statici e un statico WebProfile perché devo usare l'oggetto profilo in un statico WebMethod (ajax pageMethod ) .

  • Questo potrebbe comportare che l'oggetto profilo sia "condiviso"? da diversi utenti?
  • Non sto usando metodi e oggetti statici correttamente?

Il motivo per cui ho cambiato l'oggetto WebProfile in un oggetto statico era perché ho bisogno di accedere all'oggetto profilo all'interno di un [WebMethod] (chiamato da javascript nella pagina).

  • Esiste un modo per accedere a un oggetto profilo all'interno di un [WebMethod] ?
  • In caso contrario, quali sono le mie scelte?
È stato utile?

Soluzione

Un oggetto statico è condiviso tra tutte le istanze di un'applicazione, quindi se si modifica il valore di un oggetto statico, tale alterazione si rifletterà su tutte le istanze dell'applicazione che accedono a quell'oggetto. Pertanto, se il tuo profilo web viene riassegnato da un altro thread (ovvero un secondo utente che visita una pagina) tra le impostazioni dell'utente corrente, conterrà informazioni diverse da quelle che ti aspetti.

Per aggirare il problema, il codice dovrebbe essere simile a:

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

Si noti che l'oggetto statico non è stato impostato e che il valore restituito deve essere assegnato a un'istanza NON STATICA della classe del profilo Web nel metodo chiamante.

Un'altra opzione è BLOCCARE la variabile statica per tutto il tempo in cui è in uso, ma ciò comporterà un grave peggioramento delle prestazioni in quanto il blocco bloccherà qualsiasi altra richiesta per la risorsa fino al completamento del thread di blocco corrente - non un buon cosa in un'app Web.

Altri suggerimenti

@Geri

Se il profilo non cambia spesso per l'utente, hai la possibilità di memorizzarlo nello stato Sessione corrente. Ciò introdurrà un certo sovraccarico di memoria, ma a seconda delle dimensioni del profilo e del numero di utenti simultanei questo potrebbe essere un problema. Faresti qualcosa del tipo:

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
}

In modo che lo stato del profilo venga recuperato dalla sessione ogni volta che è necessario e dovrebbe aggirare la necessità di variabili statiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top