In ASP.NET 1.x tutto il codice delle pagine è compilato in assembly, librerie che vengono memorizzate nella cartella /bin
dell'applicazione. Le pagine web invece, per intenderci, quelle con estensione .aspx
, sono compilate automaticamente. Ogni cambiamento fatto sulla pagina .aspx
provoca la ricompilazione della pagina ma non del suo codice interno, presente nella cartella /bin
, che va invece ricompilato a parte.
In ASP.NET 2.0 invece, vengono ricompilate dinamicamente, su ogni modifica al codice, sia le pagine .aspx
sia i file .cs
o .vb
. La cartella /bin
non ha più ragione di esistere ma è ancora supportata per compatibilità con le versioni precedenti. Ci sono altre cartelle "speciali" che invece è utile conoscere e che possono essere utili nello sviluppo di applicazioni.
- App_Code, contenitore per le classi, i file WSDL e XSD; tutti i file contenuti in questa cartella sono ricompilati automaticamente;
- App_Data, contenitore per i file di database e XML;
- App_LocalResources, contenitore per i file generati dal VWD (o Visual Studio) per la localizzazione implicita dell'applicazione;
- App_GlobalResources, contenitore per i file per la localizzazione esplicita dell'applicazione, con estensione
.resx
; - App_Themes, contenitore per i temi e i file di interfaccia (skin);
- App_Browsers, contenitore per i file browser che servono per supportare diversi tipi di client;
- App_WebReferences, contenitore per i file
.wsdl
che servono per i web service;
In questo articolo, utilizzando la cartella App_Code
, verifichiamo la ricompilazione automatica della parte codice interno di una pagina.
Apriamo un nuovo sito web con il VWD e chiamiamolo "RicompilazioneDinamica", aggiungiamo alla nostra applicazione la cartella speciale App_Code
e all'interno di essa, implementiamo una classe che poi utilizzeremo nella nostra pagina. Chiamiamo la classe DataOra.cs
:
Listato 1. Classe "DataOra"
public class DataOra
{
public DataOra()
{
// costruttore della classe
}
public string ottieniDataOra()
{
return "Data e ora del server: " + DateTime.Now;
}
}
Il costruttore lo possiamo lasciare vuoto, mentre dobbiamo implementare il metodo ottieniDataOra
che restituisce una stringa con la data e l'ora del server.
Passiamo alla pagina di default. Nel codice, precisamente all'interno del gestore dell'evento Page_Load
, scriviamo:
Listato 2. Page_Load in Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
DataOra dataOraServer = new DataOra();
Response.Write(dataOraServer.ottieniDataOra());
}
Qui istanziamo un nuovo oggetto di tipo DataOra
e poi chiamiamo il metodo ottieniDataOra
.
Sul VWD premiamo F5 per testare l'applicazione. Otteniamo:
Figura 1. Primo Test
Ora, senza chiudere il browser, modifichiamo con il blocco note il file DataOra.cs
, presente all'interno della cartella App_Code
della nostra applicazione, e facciamo una modifica, ad esempio scriviamo: "Data e ora corrente sul server: " al posto di "Data e ora del Server: ".
Salviamo e aggiorniamo la visualizzazione sul browser. Otteniamo:
Il risultato ci fa capire che l'application server di ASP.NET 2.0 ha rilevato la modifica effettuata sul file e ha ricompilato automaticamente la nostra classe.
Abbiamo visto come avviene la ricompilazione dinamica di una classe posizionata all'interno della cartella speciale App_Code
dell'applicazione, c'è da fare però una precisazione.
Tutti i file presenti all'interno della cartella App_Code
vengono compilati in un unico assembly e la cartella non può contenere file scritti con linguaggi differenti tra loro come ad esempio C# e VB.NET.
Se abbiamo questo tipo di problema possiamo dividere la cartella App_Code
in sottocartelle, ognuna della quali contiene file scritti in un unico linguaggio. Per operare questa partizione in modo completo bisogna dichiararla sul file di configurazione dell'applicazione (Web.config
), alla sezione <compilation>
.
Listato 3. Web.config: suddivisione di App_Code in sottocartelle
<compilation debug="true">
<codeSubDirectories>
<add directoryName="VB"/>
<add directoryName="CS"/>
</codeSubDirectories>
</compilation>
Naturalmente bisogna aggiungere le due cartelle all'interno della App_Code
, in modo da ottenere:
Il nome delle sottocartelle non è importante e può essere scelto a piacere dallo sviluppatore. ASP.NET riconosce il linguaggio con cui sono scritti i file delle sottocartelle ed utilizza il compilatore giusto per compilare il codice sorgente.
Nonostante ci sia la possibilità di implementare un'applicazione utilizzando più di un linguaggio di programmazione, è bene sempre cercare di utilizzarne uno solo, per facilitare il più possibile le operazioni di manutenzione.
L'esempio sviluppato in questo articolo può essere scaricato da qui.