asp.net – sessione – più tabs del browser – sessioni diverse?

Mi piacerebbe mantenere uno stato di sessione per scheda del browser.

È facile (o anche ansible) farlo in ASP.NET?

Esempio: un utente colpisce Ctrl-T in firefox 5 volte e visita il sito in ogni scheda. Mi piacerebbe che ogni scheda avesse il proprio stato di sessione sul server

Per facilitare gli stati di sessione multi-tab per un utente senza ingombrare l’URL, effettuare le seguenti operazioni.

Nella tua funzione di caricamento del modulo, includi:

If Not IsPostback Then 'Generate a new PageiD' ViewState("_PageID") = (New Random()).Next().ToString() End If 

Quando salvi qualcosa nel tuo stato di sessione, includi il PageID:

 Session(ViewState("_PageID").ToString() & "CheckBoxes") = D 

Note :

  • Come per gli ID di sessione in generale, non ci si può fidare che i malintenzionati non cambieranno il SessionID / PageID. Questa è solo una soluzione valida per un ambiente in cui tutti gli utenti possono essere considerati attendibili. Fortunatamente, ViewState offre una protezione maggiore rispetto all’utilizzo di un campo di input nascosto.
  • Non avrai accesso al PageID finché il ViewState non verrà ripristinato su PostBack. Pertanto, non avrai accesso al PageID nel gestore page_init ().
      

http://msdn.microsoft.com/en-us/library/ms178581.aspx

in questo caso ogni tab avrà un ID univoco e sembrerà un altro visitatore.

Usando la risposta di Brian Webster ho trovato un problema con XMLHttpRequests. È risultato che XMLHttpRequests non ha impostato il flag IsPostback su true e quindi la richiesta sembrava una nuova richiesta e uno avrebbe finito per avere un nuovo stato di sessione per quella richiesta. Per risolvere questo problema ho anche controllato il valore di ViewState("_PageID")

in modo che il mio codice assomigli a questo in C #:

 protected dynamic sessionVar; //a copy of the session variable protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack && ViewState["_PageID"] == null) { ViewState["_PageID"] = (new Random()).Next().ToString(); Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable } sessionVar = Session[ViewState["_PageID"] + "sessionVar"]; //... }