152 messaggi dal 08 settembre 2006
In un sito asp.net web form (frmework 3.5) ho necessità di avere una variabile che venga valorizzata al momento dell'accesso alla prima pagina e che rimanga tale per tutta la navigazione; per questo ho usato una proprietà static definita in una classe; tale proprietà viene appunto valorizzata nell'evento load nella pagina main; ora da diverse prove fatte ho visto che la variabile mantiene la persistenza anche se si passa da una pagina ad un'altra (proprio come voglio io);

vorrei però essere sicuro che ciò avvenga anche quando scade la sessione, cosa che non riesco a riprodurre però in debug, infatti anche cancellando la cache le variabili di sessione rimangano attive e valorizzate; c'è un modo per far scadere la sessione da codice? ho provato con session.abandon ma non succede nulla...

grazie
Modificato da bryger il 19 ottobre 2014 10.07 -
Modificato da bryger il 19 ottobre 2014 10.07 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

bryger ha scritto:
vorrei però essere sicuro che ciò avvenga anche quando scade la sessione

Nessun problema, lo stato della sessione dell'utente non influenzerà il valore della variabile statica. Puoi dimostrarlo invocando il Session.Abandon() e poi effettuando una nuova richiesta di pagina: vedrai che il valore della variabile statica non si è resettato.

Finché l'applicazione è in esecuzione, il valore della variabile statica resterà in memoria. A proposito di questo, tieni presente che IIS arresterà l'applicazione dopo un certo periodo di inattività.
Se la tua applicazione non riceve richieste entro un lasso di tempo di 20 minuti (default), IIS la terminerà per inattività e perciò perderai il valore. Se questo sia un problema dipende dal tuo caso e dallo scopo di questa variabile statica.

Se vuoi che il valore della variabile statica sopravviva ad un riavvio dell'applicazione, dovrai persisterlo su database o su file ogni volta che viene modificata.

Attenzione quando leggi o scrivi una variabile statica: è possibile che due o più pagine (ovvero due o più threads) vadano simultaneamente ad interagire con essa, potenzialmente corrompendone il valore.
Quindi devi fare in modo che l'aggiornamento della variabile sia thread-safe, ovvero devi consentire che solo un thread alla volta possa scrivere sulla variabile in un dato momento. Lo puoi realizzare per esempio con il blocco lock. Quando un thread acquisisce un lock, nessun altro thread potrà acquisirlo a sua volta finché non verrà rilasciato. Di conseguenza, è sicuro leggere o scrivere una variabile statica all'interno di un blocco lock.

In alternativa, puoi usare la classe Interlocked. Se la tua variabile statica è un numero intero e vuoi semplicemente incrementarlo ad ogni accesso di pagina, allora usa il suo metodo Increment.

ciao,
Moreno
Modificato da BrightSoul il 19 ottobre 2014 11.34 -

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
Fortunatamente non ci sono altre pagine che modificano la variabile, il tutto è (o dovrebbe) essere fatto in modo che solo la pagina di accesso agisca sulla variabile; quindi non è nemmeno necessario salvare il valore in una variabile di sessione giusto?

a questo punto però sorge un dubbio,dopo i venti minuti che succede? quello che hai descritto non è il caso in cui la sessione scade per inattività? nel codice ho aggiunto una condizione che se la variabile risulta non valorizzata viene in pratica ricalcolata e rivalorizzata, può essere sufficiente?

Grazie per la consueta chiarezza e precisione nei tuoi suggerimenti....
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, prego :)

bryger ha scritto:

solo la pagina di accesso agisca sulla variabile

Ok, tuttavia più utenti possono collegarsi contemporaneamente alla pagina di accesso. Questo vuol dire che esiste comunque la possibilità che due o più thread vadano a scrivere contemporaneamente sulla variabile statica.

...a meno che ovviamente questa non sia un'applicazione di cui sei tu l'unico utente.

bryger ha scritto:

quello che hai descritto non è il caso in cui la sessione scade per inattività?

No, la sessione riguarda il singolo utente e scade quando quell'utente non ha inviato richieste web negli ultimi 20 minuti.

Il timeout per inattività di cui ti parlavo prima, invece, riguarda IIS. Se il webserver non riceve almeno una richiesta da un utente qualsiasi, allora "spegnerà" l'applicazione per inattività.

Per fare un esempio: nel corso della giornata l'applicazione vede arrivare molti utenti e altrettante sessioni scadranno per inattività dopo che quegli utenti se ne sono andati. Ciò nonostante, l'applicazione continuerà sempre a funzionare (e la variabile statica resterà in memoria) purché arrivi almeno una richiesta da un utente qualsiasi nell'arco di 20 minuti.

Entrambi i timeout possono essere configurati indipendentemente l'uno dall'altro. Mettiamola così: è "solo un caso" che entrambi siano impostati per default a 20 minuti.

ciao e buona domenica,
Moreno
Modificato da BrightSoul il 19 ottobre 2014 14.52 -

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
mmmm, questa cosa non mi piace, ti spiego la situazione, il sito prevede che all'accesso deve essere memorizzato il codice di un'azienda, legata univocamente all'utente (preso a sua volta dall'accesso al dominio tramite funzione esterna dal progetto)

Questo valore deve rimanere lo stesso per quell'utente durante tutta la 'vita' dell'applicazione.

Per questo ho utilizzato la variabile definita nella classe, in modo tale che sia sempre visibile da tutte le pagine e funzioni.

Il valore però appunto deve essere relativo all'utente che ha aperto il sito.

Se un'altro utente ha accesso l'azienda collegata sarà diversa e di conseguenza dovrà esserlo il valore della variabile.

Da quello che hai scritto mi pare di capire che la variabile è unica per tutte le sesioni (cioè utenti che lo aprono) del sito?

quindi forse l'uso di questo tipo di variabile non è adatto?

e in tal caso come è meglio fare?

grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

bryger ha scritto:

Da quello che hai scritto mi pare di capire che la variabile è unica per tutte le sesioni (cioè utenti che lo aprono) del sito?

Esattamente, quindi non è idonea a risolvere il tuo problema.

bryger ha scritto:

il codice di un'azienda, legata univocamente all'utente (preso a sua volta dall'accesso al dominio tramite funzione esterna dal progetto)

Domanda banale: non potresti salvare il nome utente e il relativo codice azienda nella tabella di un database? Immagino che tu ci abbia già pensato, quindi... perché hai scartato questa soluzione?

Se non vuoi inviare queries al database, potresti salvare il codice azienda come parte del suo username, quando emetti il cookie di autenticazione. Esempio:
FormsAuthentication.SetAuthCookie("CodAzienda/Mario", true);

In tutte le successive richieste di pagina, potrai estrarre il codice azienda da HttpContext.Current.User.Identity.Name (o più brevemente: User.Identity.Name)
In questo modo l'applicazione può anche riavviarsi perché quell'informazione è in possesso del client, memorizzata in un cookie dal contenuto crittografato.

ciao,
Moreno
Modificato da BrightSoul il 19 ottobre 2014 20.34 -

Enjoy learning and just keep making
152 messaggi dal 08 settembre 2006
In realtà non è necessario che il valore venga mantenuto da una sessione di lavoro ad un'altra, basta che rimanga valido in tutta una sessione di lavoro quindi non serve l'utilizzo del database, per ora dovrei aver risolto con l'utilizzo di una variabile di sessione però, per quanto possibile dato che non ho la complata gestione del progetto, cercherò di implementare anche la strada che mi hai suggerito utilizzando il cookie....

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.