Mantenere lo stato e passare informazioni tra pagine - seconda parte

Oltre al ViewState, QueryString e Post esposti nella prima parte di questo articolo esistono altri modi per mantenere lo stato e passare dati tra una pagina e l'altra di una applicazione web AspNet.

Cookies

I Cookies sono informazioni di tipo testuale memorizzati nel client. Solitamente vengono usati per conservare le preferenze di visualizzazione dei siti internet. Non vengono memorizzate informazioni riservate poiché i dati sono in chiaro.

La visibilità è a livello di dominio, pertanto sarà visibile e scrivibile da tutte la pagine del sito.

Hanno una data di scadenza, ma se non viene specificata il cookie scade alla chiusura del browser. Notare che ogni browser del pc ha i propri Cookie.

Il vantaggio dei Cookies sta nel fatto che non appesantiscono il server quindi sono indicati nelle applicazioni o nei siti con un alto numero di utenti connessi contemporaneamente.

Il form di questo esempio permette di salvare il nome utente in un Cookie. Una volta salvato si potrà chiudere il browser e ricaricare la pagina per vedere il messaggio di benvenuto personalizzato.

<body>
    <form id="form1" runat="server">
    <div>
        <p>
            <asp:Label ID="lblBenvenuto" runat="server"></asp:Label>
        </p>  
        <asp:Label ID="lblNome" runat="server" Text="Nome: "></asp:Label>
        <asp:TextBox ID="txtNome" runat="server"></asp:TextBox>&nbsp;
        <asp:Button ID="btnCreaCookie" runat="server" Text="Crea Cookie" />    
    </div>
    </form>
</body>

Si crea una variabile di tipo HttpCookie e poi si impostano gli elementi.
Per dire al client di scrivere il Cookie si usa il comando Response.Cookies.Add(NomeCookie)

Partial Class Cookies_demo
    Inherits System.Web.UI.Page

    Protected Sub btnCreaCookie_Click(sender As Object, e As System.EventArgs) _ 
                Handles btnCreaCookie.Click

        Dim objCookie As HttpCookie = Request.Cookies("Utente")

        'se il cookie non esiste già allora lo creo
        If objCookie Is Nothing Then
            objCookie = New HttpCookie("Utente")
        End If

        objCookie("Nome") = txtNome.Text            'aggiungo un parametro
        objCookie.Expires = Date.Now.AddMonths(1)   'imposto la data di scadenza tra un mese
        
        Response.Cookies.Add(objCookie)             'aggiungo il cookie alla risposta web

        lblBenvenuto.Text = "Cookie creato con successo.<br />"
        lblBenvenuto.Text &= "Nome: " & objCookie("Nome")
    End Sub

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        Dim objCookie As HttpCookie = Request.Cookies("Utente")
        If objCookie Is Nothing Then
            lblBenvenuto.Text = "Utente sconosciuto"
        Else
            lblBenvenuto.Text = "Benvenuto " & objCookie("Nome")
        End If
    End Sub
End Class

Per modificare un Cookie è necessario rimuoverlo e poi ricrearlo. Per ulteriori informazioni consultare la guida su msdn.

Sessioni

Le sessioni sono simili ai Cookies però risiedono sul server. Il client utilizza un session Id memorizzato in un cookie o trasmesso via querystring per comunicare al server la corretta sessione da utilizzare.

Le sessioni sono considerate sicure in quanto i dati non vengono mai trasmessi al client.
Inoltre a differenza dei Cookie possono contenere anche dati complessi, come tipi di dati personalizzati.

Un uso eccessivo di sessioni appesantisce il server specie quando ci sono tanti utenti connessi simultaneamente. Bisogna quindi memorizzare in sessione solo i dati strettamente necessari.

Le sessioni scadono dopo n minuti dall'ultima richiesta del client, solitamente dopo 20 minuti.

Ecco come creare, leggere e cancellare una sessione:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblBenvenuto" runat="server" Text=""></asp:Label>
        <br />
        <asp:Label ID="lblNome" runat="server" Text="Nome "></asp:Label>
        <asp:TextBox ID="txtNome" runat="server"></asp:TextBox>
        <asp:Button ID="btnScriviSessione" runat="server" Text="Scrivi Sessione" />    
        <br />
        <asp:Button ID="btnChiudiSessione" runat="server" Text="Chiudi Sessione" />    
    </div>
    </form>
</body>
Protected Sub btnScriviSessione_Click(sender As Object, e As System.EventArgs) Handles btnScriviSessione.Click
	Session("Nome") = txtNome.Text  'scrive una variabile di sessione
End Sub

Protected Sub btnChiudiSessione_Click(sender As Object, e As System.EventArgs) Handles btnChiudiSessione.Click
	Session.Clear()     'pulisce i dati della sessione mantenendo lo stesso Id
	'Session.Abandon()  'chiude la sessione
End Sub

Protected Sub Page_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
	'legge la sessione
	If Session("Nome") Is Nothing Then
		lblBenvenuto.Text = "Nessun dato presente in sessione"
	Else
		lblBenvenuto.Text = "Benvenuto, " & Session("Nome")
	End If
End Sub

Application

Le variabili di tipo Application sono simili alle sessioni ma sono visibili da tutti i client.
Rimangono in memoria fino al riavvio del server.

Un esempio di utilizzo è il numero di utenti collegati a un sito.

E' possibile anche creare una variabile Application nel file Global.asax, in questo caso un contatore.

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
	' Code that runs on application startup
	Application("Contatore") = 0
End Sub

Poi si possono aprire più istanze della pagina, anche con browser e pc diversi e agire sul contatore. Si vedrà che aggiornando la pagina ogni browser mostrerà lo stesso valore del contatore.

<body>
    <form id="form1" runat="server">
    <div>

        <asp:Label ID="label1" runat="server" Text="Contatore: "></asp:Label>
        <asp:Button ID="btnDecrementa" runat="server" Text="-" /> 
        <asp:Label ID="lblContatore" runat="server" Text="0"></asp:Label> 
        <asp:Button ID="btnIncrementa" runat="server" Text="+" />
    </div>
    </form>
</body>
Partial Class Application_Demo
    Inherits System.Web.UI.Page

    Protected Sub btnDecrementa_Click(sender As Object, e As System.EventArgs) Handles btnDecrementa.Click
        Application("Contatore") -= 1
    End Sub

    Protected Sub btnIncrementa_Click(sender As Object, e As System.EventArgs) Handles btnIncrementa.Click
        Application("Contatore") += 1
    End Sub

    Protected Sub Page_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
        lblContatore.Text = Application("Contatore").ToString
    End Sub
End Class

Autore: Sergio Roberto Boarina