Newsgroup: it.comp.www.asp
Titolo: Global.asax e variabili globali

Salve a tutti.
Mi sto cimentando nel convertire un'applicativo scritto in ASP
nell'evoluzione ASP.net.
Pur consultando varia documentazione nessuno ne tratta l'argomento
chiaramente.
Nel mio applicativo in ASP potevo inserire un oggetto tipo una
connessione ADO nel file Global.asa e poi farci riferimento in tutte
le pagine come una variabile globale.
Ora, in 
asp.net
, utilizzando VS .Net, vedo che con la medesima
operazione non produce lo stesso effetto desiderato.
Mi vien creata una classe di nome "Global", alla quale posso far
riferimento creandone un'istanza.. ma non serve al mio scopo in
quanto, non essendo un oggetto globale all'applicazione, non posso
usarlo a livello Application dando modo a tutti gli utenti connessi di
vedere la stessa istanza all'oggetto.
Come funziona in 
asp.net
.. cioè, come posso fare per convertire il
vecchio global.asa in Asp.net secondo questo punto di vista di
condivisione di oggetti globali?
Grazie a chiunque mi dia aiuto.
Matteo.


Moderatore di it.comp.www.asp - Microsoft .NET MVP
http://www.aspitalia.com/
 Enjoy the .NET community!
Corso Classic ASP, 
ASP.NET
 a Treviso? Dal 16 Giugno
su 
http://corsi.aspitalia.com/corsi/treviso.aspx

Grazie per aver accolto il mio messaggio Daniele.
Sò che è brutta pratica, ma quando sei costretto per forze maggiori..
non ti puoi neanche tanto opporre.
A me sarebbe piaciuto fare una mia classe per gestire le connessioni e
l'uso del DB di sistema del mio applicativo, in modo tale da poter
sfruttare tutte le connessioni disponibili, etc.. ma così non posso
fare.
Spiego meglio il mio messaggio:
Usando visual studio .net ho il mio global.asax che mi va a puntare ad
una classe di nome Global su un altro file di codice *.cs sfruttando
le parole Codebehind e Inerhits.. e fin qui tutto ok.
Questo il file Global.asax:
<%@ Application Codebehind="Global.asax.cs" Inherits="Myapp.Global" %>
Questo sintesi del file Global.asax.cs:
namespace Myapp
{
  public class Global : System.Web.HttpApplication
    {
      public static System.Data.SqlClient.SqlConnection Cns;
      public Global()
	{ Cns = new System.Data.SqlClient.SqlConnection(); }	
 
      protected void Application_Start(Object sender,EventArgs )
        { }
 
      protected void Application_End(Object sender,EventArgs )
        { }
    }
Io pensavo, da quanto capito da un insieme di fonti, che Global fosse
un oggetto ereditato da HTTPapplication e a sua volta ereditato da
HTTPapplicationState. A questo Global, in maniera trasparente, ci
potevo accedere con Application[nomevariabile] etc.. come in asp.
Tipo:  Application["Cns"] per puntare al mio oggetto interssato.
E presupponevo che all'avvio di una applicazione il mio oggetto
(credevo una sorta di statico) fosse già bello che pronto.
Ma così non è.
Non vedo l'oggetto dalle altre pagine, ne con Application["Cns"] e
nemmeno con  Global.Cns a meno che non li dichiari statici (la classe
non può essere dichiarata statica quindi solo Cns).
Quindi, se io volessi una variabile visibile e utilizzabile da
qualsiasi pagina dell'applicazione, tipo una connessione ad un DB come
nel mio caso, legando agli eventi Application_OnStart e
Application_OnEnd la connessione e disconnessione al DB, come posso
fare?
Ci sarà un modo per farlo con i sistemi Microsoft. 
Come funziona questo oggetto Global che mi vien a crearsi
automaticamente per default da Visual Studio .net?
Capisco il tuo suggerimento nell'inserire un metodo statico
dell'oggetto, posso anche dichiarare direttamente la mia variabile
statica e avrei la visibilità della stessa a livello application, ma
allora, quando posso inizializzarla la connessione? Nella prima
ipotetica pagina? Non mi sembra la procedura corretta...

 ipotetica pagina? Non mi sembra la procedura corretta...
potresti aprirla nell'Application_OnStart.
sul fatto che non sia corretta concordiamo, ma imho non lo è tutta
l'architettura di questa cosa che vuoi fare.
di preciso _perchè_ vuoi tenere la connessione in una variabile application?


 di preciso _perchč_ vuoi tenere la connessione in una variabile application?
La vorrei tenere in una variabile application in modo tale da : 
  1) seguire dlle direttive che, anche se possono non essere giuste,
al capo non si puň dir sempre di no.
  2) Perchč in questo modo non c'č rischio di avere troppe connessioni
al DB, o almeno non piů di quante il DB ne consenta.
  3) Perchč in questa maniera la concorrenza all'accesso al DB viene
gestita dal framework, anche se abbassando i tempi di risposta perchč
viene usata la serializzazione.. uno per volta quindi.
Spero in ogni caso di risolvere la questione imponendo qualcosa di
molto piů appropriato e intelligente. Tu come faresti a gestire
l'accesso ad un DB in un applicazione WEB?
Grazie ancora, Matteo

 l'accesso ad un DB in un applicazione WEB?
ASP.NET
 (se usato con IIS 6 in maniera particolare) permette di utilizzare
meccanismi di caching avanzati:
- dati
- fragment
- pagina
in questo modo non è detto che una pagina chiami ogni volta il db e con
opportune politiche di caching sui dati puoi evitare proprio di richiederli,
massimizzando le performance.
