Sessioni persistenti

giovedì 23 maggio 2013 - 17.38
Tag Elenco Tags  VB.NET  |  .NET 1.1  |  Windows XP  |  Visual Studio 2003

zizu75 Profilo | Newbie

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:

#Const SESSIONI_XML = True

#If SESSIONI_XML Then
'IMPORTANTE: creare una directory nel seguente percorso, o cambiare
'Il percorso per abbinare una directory esistente
Const SESSIONDATAPERCORSO = "C:\lavoriAspReale\ApplicazioniApsNet\DatiSessione\"

Private Sub Global_AcquireRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.AcquireRequestState
Diagnostics.Debug.WriteLine("Global_AcquireRequestState")
Dim fs As System.IO.FileStream
Dim sf As New System.Runtime.Serialization.Formatters.Soap.SoapFormatter
Try
'ottiene un particolare cookie ed esce se non lo trova
Dim cookie As HttpCookie = Request.Cookies("PermessoSessioneID")
If (cookie Is Nothing) Then
'se non lo trova ,lo genera (utilizza un sessionID pseudocasuale)
cookie = New HttpCookie("PermessoSessioneID", Session.SessionID)
'fa in modo che scadi dopo 10 miniti,nell'esempio del libro 1 settimana
cookie.Expires = Now.AddMinutes(10)
'lo invia al browser del client e termina
Response.Cookies.Add(cookie)
Exit Try
End If
'il nome del file è ugale al valore del cokie
Dim permSessioneID As String = cookie.Value
'crea il nome del file di dati
Dim nomefile As String = SESSIONDATAPERCORSO & permSessioneID.ToString & ".xml"
'apre il file ,esce in caso di errore
fs = New System.IO.FileStream(nomefile, IO.FileMode.Open)
'deserializza la tabella hash che contiene i valori
Dim ht As Hashtable = DirectCast(sf.Deserialize(fs), Hashtable)
'sposta i dati nella collezione session
Dim key As String
Session.Clear() 'azzera i valori della sessione standard
For Each key In ht.Keys
Session(key) = ht(key)
Next
Catch ex As Exception
'ignora oni eccezione
Finally
'chiude il flusso e esce
If Not (fs Is Nothing) Then fs.Close()
End Try

End Sub

'una volta elaborata la richiesta ,il codice di Global_ReleaseRequestState crea un file xml
'lato server il cui nome sara preso dal cookie PermessoSessioneID letto o creato in precedenza
'Poi serializza tutte le variabili session nel file xml e azzera la collezione session per ridurre
'al minimo l'utilizzo di memoria sul server


Private Sub Global_ReleaseRequestState(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.ReleaseRequestState
'ottiene il cookie perticolare
Dim cookie As HttpCookie = Request.Cookies("PermessoSessioneID")
'il valore del cookie è il nome del file xml
Dim permSessioneID As String = cookie.Value
'sposta i dati dalla collezione session in una hashtable
Dim ht As New Hashtable(Session.Count)
For Each key As String In Session.Keys
ht(key) = Session(key)
Next
'azzera la collezione session standard,per risparmiare memoria
Session.Clear()
Dim fs As System.IO.FileStream
Dim sf As New System.Runtime.Serialization.Formatters.Soap.SoapFormatter
Try
'crea il nome del file di dati
Dim nomefile As String = SESSIONDATAPERCORSO & permSessioneID.ToString & ".xml"
'apre il file ,esce in caso d'errore
fs = New System.IO.FileStream(nomefile, IO.FileMode.Create)
'serializza la tabella hash che contiene i valori
sf.Serialize(fs, ht)

Catch ex As Exception
'ignora oni eccezione
Finally
'chiude il flusso e esce
If Not (fs Is Nothing) Then fs.Close()
End Try

End Sub
#End If
per utilizzarlo invece nell'evento load sella pagina scrivo il seguente codice

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim nome As String
If Session("nome") Is Nothing Then
Session("nome") = "casa"
Else
Session("nome") = TextBox1.Text
Session("nome") = CStr(Session("nome"))
End If
Label3.Text = "<B>" & nome & "</b> : " & CType(Session.Item("nome"), String) & "<br>"
If Session("Contatore") Is Nothing Then
Session("Contatore") = 0
Else
Session("Contatore") = CInt(Session("Contatore")) + 1
End If

lblContatore.Text = "Contatore = " & Session("Contatore").ToString
End Sub

mexico77 Profilo | Junior Member

Scusa non ti conviene salvare direttamente tutto in un cookie a questo punto invece di fare tutto questo lavoro.
www.setteweb.it

zizu75 Profilo | Newbie

lo so ma vorrei usare questa tecnica perché mi incuriosisce e per poterla utilizzare in un carrello della spesa di un mio progetto senza utilizzare cosi sql server

zizu75 Profilo | Newbie

lo so ma vorrei usare questa tecnica perché mi incuriosisce e per poterla utilizzare in un carrello della spesa di un mio progetto senza utilizzare cosi sql server
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5