Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - sessioni persistenti
Forum - C# / VB.NET - sessioni persistenti

Avatar
zizu75 (Normal User)
Newbie


Messaggi: 1
Iscritto: 23/05/2013

Segnala al moderatore
Postato alle 17:51
Giovedì, 23/05/2013
salve, ho un problema con dei dati di un form che devo salvare in una variabile session  e renderli persistenti ,cioè se chiudo il browser alla riapertura successiva devo rivedere i dati dell'ultima sessione di lavoro.Ho trovato un esempio su un libro dove c'è un contatore  che si incrementa ha ogni visita della pagina ,  se chiudo l'applicazione riprende dall'ultimo valore e non da zero.L'esempio del libro utilizza un file XML sul server, dove viene salvato il valore della variabile session, cosi come  memorizzati alla fine della richiesta precedente.Il codice legge questo file e popola la collezione Session prima che la pagina veda i nuovi valori.Il tutto funziona con il contatore ,ma io vorrei integrare la pagina con una textbox Nome,leggere il valore all'interno, visualizzarlo il una label di riepilogo e far si che pure questo valore sia leggibile al prossimo accesso (ma niente non riesco,anche se il valore viene salvato nel file XML non riesco poi a leggerlo).COME POSSO FARE???[:(] .Il file XML viene salvato sul server in una cartella , il nome di questo file sarà il valore del cookie, che tramite l'evento AcquireRequestState di global.asax sarà letto.Se questo cookie non esiste  vuol dire che è la prima richiesta di questo client e pertanto il codice crea il cookie e vi memorizza una stringa casuale.Il codice dell'evento AcquireRequestState  è il seguente:

Codice sorgente - presumibilmente VB.NET

  1. #Const SESSIONI_XML = True
  2.  
  3. #If SESSIONI_XML Then
  4.     'IMPORTANTE: creare una directory nel seguente percorso, o cambiare
  5.     'Il percorso per abbinare una directory esistente
  6.     Const SESSIONDATAPERCORSO = "C:\lavoriAspReale\ApplicazioniApsNet\DatiSessione\"
  7.  
  8.     Private Sub Global_AcquireRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.AcquireRequestState
  9.         Diagnostics.Debug.WriteLine("Global_AcquireRequestState")
  10.         Dim fs As System.IO.FileStream
  11.         Dim sf As New System.Runtime.Serialization.Formatters.Soap.SoapFormatter
  12.         Try
  13.             'ottiene un particolare cookie ed esce se non lo trova
  14.             Dim cookie As HttpCookie = Request.Cookies("PermessoSessioneID")
  15.             If (cookie Is Nothing) Then
  16.                 'se non lo trova ,lo genera (utilizza un sessionID pseudocasuale)
  17.                 cookie = New HttpCookie("PermessoSessioneID", Session.SessionID)
  18.                 'fa in modo che scadi dopo 10 miniti,nell'esempio del libro 1 settimana
  19.                 cookie.Expires = Now.AddMinutes(10)
  20.                 'lo invia al browser del client e termina
  21.                 Response.Cookies.Add(cookie)
  22.                 Exit Try
  23.             End If
  24.             'il nome del file è ugale al valore del cokie
  25.             Dim permSessioneID As String = cookie.Value
  26.             'crea il nome del file di dati
  27.             Dim nomefile As String = SESSIONDATAPERCORSO & permSessioneID.ToString & ".xml"
  28.             'apre il file ,esce in caso di errore
  29.             fs = New System.IO.FileStream(nomefile, IO.FileMode.Open)
  30.             'deserializza la tabella hash che contiene  i valori
  31.             Dim ht As Hashtable = DirectCast(sf.Deserialize(fs), Hashtable)
  32.             'sposta i dati nella collezione session
  33.             Dim key As String
  34.             Session.Clear() 'azzera i valori della sessione standard
  35.             For Each key In ht.Keys
  36.                 Session(key) = ht(key)
  37.             Next
  38.         Catch ex As Exception
  39.             'ignora oni eccezione
  40.         Finally
  41.             'chiude il flusso e esce
  42.             If Not (fs Is Nothing) Then fs.Close()
  43.         End Try
  44.  
  45.     End Sub
  46.  
  47.     'una volta elaborata la richiesta ,il codice di Global_ReleaseRequestState crea un file xml
  48.     'lato server il cui nome sara preso dal cookie PermessoSessioneID letto o creato in precedenza
  49.     'Poi serializza tutte le variabili session nel file xml e azzera  la collezione session per ridurre
  50.     'al minimo l'utilizzo di memoria sul server
  51.  
  52.  
  53.     Private Sub Global_ReleaseRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.ReleaseRequestState
  54.         'ottiene il cookie perticolare
  55.         Dim cookie As HttpCookie = Request.Cookies("PermessoSessioneID")
  56.         'il valore del cookie è il nome del file xml
  57.         Dim permSessioneID As String = cookie.Value
  58.         'sposta i dati  dalla collezione session in una hashtable
  59.         Dim ht As New Hashtable(Session.Count)
  60.         For Each key As String In Session.Keys
  61.             ht(key) = Session(key)
  62.         Next
  63.         'azzera la collezione session standard,per risparmiare memoria
  64.         Session.Clear()
  65.         Dim fs As System.IO.FileStream
  66.         Dim sf As New System.Runtime.Serialization.Formatters.Soap.SoapFormatter
  67.         Try
  68.             'crea il nome del file di dati
  69.             Dim nomefile As String = SESSIONDATAPERCORSO & permSessioneID.ToString & ".xml"
  70.             'apre il file ,esce in caso d'errore
  71.             fs = New System.IO.FileStream(nomefile, IO.FileMode.Create)
  72.             'serializza la tabella hash che contiene i valori
  73.             sf.Serialize(fs, ht)
  74.  
  75.         Catch ex As Exception
  76.             'ignora oni eccezione
  77.         Finally
  78.             'chiude il flusso e esce
  79.             If Not (fs Is Nothing) Then fs.Close()
  80.         End Try
  81.  
  82.     End Sub
  83. #End If
  84. per utilizzarlo invece nell'evento load sella pagina scrivo il seguente codice
  85.  
  86.  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  87.         Dim nome As String
  88.         If Session("nome") Is Nothing Then
  89.             Session("nome") = "casa"
  90.         Else
  91.             Session("nome") = TextBox1.Text
  92.             Session("nome") = CStr(Session("nome"))
  93.         End If
  94.         Label3.Text = "<B>" & nome & "</b> : " & CType(Session.Item("nome"), String) & "<br>"
  95.         If Session("Contatore") Is Nothing Then
  96.             Session("Contatore") = 0
  97.         Else
  98.             Session("Contatore") = CInt(Session("Contatore")) + 1
  99.         End If
  100.  
  101.         lblContatore.Text = "Contatore = " & Session("Contatore").ToString
  102.     End Sub


PM Quote