Variabile statica per mantenere un valore a livello globale

martedì 29 giugno 2010 - 11.32

paquito_ita Profilo | Senior Member

Ciao,

in un'applicazione web [ASP.NET/C#] ho una classe nell' APP_Code responsabile di comunicare con un server esterno tramite un Session_ID.

Tale valore, una volta inizializzato, dovrebbe essere valido "Application_Level", ossia ogni utente lo utilizzerà per richiedere il servizio esterno. La validità di tale Session_ID è di un'ora, dopodichè un nuovo valore deve essere generato.

Al fine di ottenere questo ho utilizzato due variabili statiche con scope private per mantenere il valore del Session_ID e il TimeStamp in cui è stato generato:
private static string sessionID = null; private static DateTime? sessionCreationTime = null; if (string.IsNullOrEmpty(sessionID)) { string challengeID = this.getChallenge(); sessionID = this.getSessionID(challengeID); sessionCreationTime = DateTime.Now; } else { TimeSpan diffDate = DateTime.Now - sessionCreationTime.Value; if (diffDate.Minutes > 50 || diffDate.Hours > 0) { string challengeID = this.getChallenge(); sessionID = this.getSessionID(challengeID); sessionCreationTime = DateTime.Now; } }


Facendo il debug dell'applicazione ho tuttavia notato se l'utente fa logout e login nuovamente il valore Session_ID viene reimpostato a null.

Quindi tali variabili rimangono vaide solo all'interno dell'i-esimo Thread utente e non a livello globale per tutti gli utenti?

Grazie per ogni risposta

Gluck74 Profilo | Guru

Ciao,
il valore del session_ID cambia per ogni utente, e cambia ad ogni scadenza della sessione, sia che l'utente abbia fatto il logout, sia che sia scaduta la sessione dopo il tempo prestabilito.

Se vuoi memorizzare un valore che non cambia, o te lo generi da solo con un algoritmo di tua scelta, o utilizzi, se può fare al caso tuo, l'Application_ID.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

paquito_ita Profilo | Senior Member

Ciao e grazie per i consigli.

Ho visto che variabili "Application" funzionano come le Session, ma ad un "application level" che sarebbbe ciò che mi serve.
L'unico problem è che nella classe C# in cui ho bisogno di settare/reperire tale valore di variabile globale, non ho una reference alla Page, quindi non posso (o almeno non so come) inizializzare una variabile Application.

Come potrei altrimenti agggirare tale problema o ottenere una soluzione simile considerando che la variabile ha una valifità di un'ora, dopodichè, se nuovamente richiesta, va reinizilizzata?

grazie di nuovo

Gluck74 Profilo | Guru

da una classe in app_code fai riferimento a "HttpContext.Current" per accedere a quello che ti serte.
Inoltre, se ti serve semplicemente generare un codice identificativo random, puoi usare "System.Guid.NewGuid().ToString()"

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

TOPOAMORE Profilo | Expert

Ciao,

secondo me devi salvarla in un db con relativa data e ora di creazione
__.__.__.__.__.__

ASP 2.0 - VB 2008

paquito_ita Profilo | Senior Member

La variabile non è random, ma un codice univoco che viene restituito dal server esterno e ha validità di un'ora.

L'opzione del DB non sarebbe proprio ottimale: ogni volta che un utente vuole iniziare una videoconferenza, tale variabile viene acceduta. Considerando che in media ad una conferenza partecipano 5/8 utenti e che ci possono essere diverse conferenze per progetto (con diversi progetti) si creerebbe del traffico che vorrei evitare.

Visto che riesco, grazie al suggerimento, ad ottenere HttpContext.Current.Application["SessionID"] = "...."; nella mia classe opterei per tale solzuione, in modo da avere tale variabile a disposizione di ogni utente, senza dovermi preoccupare della scadenza della sessione utente.
Inoltre aggiungerei lock()/unlock() prima e dopo, rispettivamente, l'inizializzazione della suddetta variabile, onde evitare problemi di accesso in scrittura.

Altrimenti esiste una soluzione migliore, in tale contesto, di Application?

TOPOAMORE Profilo | Expert

altrimenti recuperi il valore della variabile è l'attacchi all'url in modo da averla sempre presente
__.__.__.__.__.__

ASP 2.0 - VB 2008

Gluck74 Profilo | Guru

io non ho ben capito l'uso di questa "varibile" che poi è fissa.

C'è un server esterno che ti da questo dato e tu lo devi salvare?
Deve essere uguale per tutti gli utenti e tutte le sessioni? (quindi a livello di applicazione?)

quando ricevi questo valore? quando lo salvi?

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

paquito_ita Profilo | Senior Member

Il servizio di videoconferenza viene impostato attraverso delle RPC call. Inizialmente è necessario ottenere da tale server esterno un identificativo di sessione (Session_ID) che viene poi usato per eseguire tutte le successive RPC call (imposta orario videoconferenza, aggiungi partecipanti, etc.).

Il reperimento del Session_ID è uno step obbligato e viene fatto inizialmente per aprire un "contatto" con il server esterno per le successive chiamate e ha una durata di un'ora (quindi entro un ora il valore non cambia). Successivamente se un qualsiasi utente richiede una videoconferenza e il Session_ID è scaduto, e ne viene richiesto un altro (sempre tramite RPC call). Richieste successive, entro l'ora di validità, utilizzeranno lo stesso Session_ID, fino allo scadere della validità.

Si tratta quindi di un valore che qualsiasi utente che richiede il servizio utilizza e non avrebbe senso generarlo nuovamente per ogni utente/ad ogni richiesta, dal momento che serve solo come base comune per qualsiasi richiesta al server esterno, quindi comune a tutti gli utenti.

Spero di essere stato un pò più chiaro, altrimenti chiedete pure.

TOPOAMORE Profilo | Expert

come ho detto sopra: attacca il valore all'url
__.__.__.__.__.__

ASP 2.0 - VB 2008

paquito_ita Profilo | Senior Member

Attaccare il valore della variabile all'URL non è realizzabile, nel senso che l'URL contiene già altri parametri (anche troppi in realtà). Qualora avremo tempo nel team di sviluppo, eliminiremo qualsiasi queryString dall'URL.

Perché non utilizzare la soluzione con Application? Al momento mi sembra la soluzione piu' semplice e meno intrusiva o ci sono controindicazioni in questo?

Gluck74 Profilo | Guru

grazie della spiegazione, avevo capito bene allora.
Si, puoi salvarlo tranquillamente nell'application, non ci vedo niente di male.

Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5