Domanda

Ho letto alcuni approcci alla memorizzazione del viewstate sul server:

Eccone uno

Eccone un altro

Ma sono un po’ complicati.Sto cercando un modo per persistere un oggetto senza doverlo serializzare.Potrei utilizzare lo stato della sessione, ma se un utente apre più di una finestra, potrebbero verificarsi sovrascritture dell'oggetto.

Esiste una soluzione semplice a questo?

È stato utile?

Soluzione

In questa situazione inserirei l'oggetto nella sessione utilizzando una chiave univoca e collegherei la chiave alla pagina.Tutto questo può essere astratto in proprietà sulla classe della pagina.

public string PersistanceKey
{
    get { 
        if(ViewState["PersistanceKey"] == null)
           ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();

        return (string)ViewState["PersistanceKey"];
    }
}

public PersistanceObject Persistance
{
    get {
        if(Session[this.PersistanceKey] == null)
            Session[this.PersistanceKey] = new PersistanceObject();

        return (PersistanceObject)Session[this.PersistanceKey];
}

Le diverse chiavi di sessione consentirebbero oggetti diversi in base alla pagina.In alternativa, invece di utilizzare l'oggetto Session, potresti prendere in considerazione l'utilizzo della cache dell'applicazione (l'oggetto Cache) per rimuovere automaticamente le voci obsolete dalla memoria, ma questo ha i suoi avvertimenti.

Va notato che gli avvertimenti di Joel sulla sua risposta sull'utilizzo della memoria sono del tutto accurati.Questa potrebbe non essere l'idea migliore per scenari con memoria ridotta, utilizzo elevato o oggetti con persistenza elevata.

Altri suggerimenti

  

Sto cercando un modo per persistere un oggetto senza doverlo serializzare.

Stai attento. Ciò avrà un impatto drammatico sull'uso della memoria del tuo sito e l'uso della memoria è spesso il principale ostacolo alla scalabilità.

Assegna un numero a ciascuna finestra che l'utente potrebbe aprire. Aggiungi quel numero alla chiave di sessione. Dovresti anche memorizzare il numero da qualche parte nella pagina (querystring o un input nascosto) per poter recuperare la variabile di sessione appropriata.

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