Lโobiettivo della presente guida รจ quello di introdurvi alle applicazioni web sviluppate attraverso Microsoft ASP.NET, il famoso framework web della casa di Redmond usufruendo degli strumenti offerti da Visual Studio, lโambiente di sviluppo di riferimento per gli sviluppatori .NET.
Il mondo del web offre diverse scelte per quanto riguarda gli ambienti di sviluppo e negli ultimi anni ASP.NET si รจ molto evoluto, fino a divenire uno dei framework per la gestione di richieste HTTP piรน consistenti, stabili e ricchi di funzionalitร nel panorama mondiale.

ASP.NET e Visual Studio, il noto ambiente di sviluppo Microsoft, includono una grande quantitร di funzionalitร che rendono la vita degli sviluppatori web piรน facile. Per esempio Visual Studio mette a disposizione diversi modelli di progetto che รจ possibile utilizzare per sviluppare un sito ed inoltre supporta diverse modalitร di distribuzione delle applicazioni web, come vedremo.
Attraverso il debugger di Visual Studio รจ possibile testare il sito e analizzare le aree critiche del nostro codice, al fine di individuare potenziali problemi. Attraverso il designer รจ possibile inoltre sviluppare interfacce utente avanzate in modo molto rapido e intuitivo, spostando tramite il mouse i controlli per visualizzare in tempo reale come essi appariranno nella versione definitiva dellโapplicazione.
Utilizzando ASP.NET รจ dunque possibile creare qualsiasi cosa che รจ possibile trovare su internet, dai portali di e-commerce, ai siti di consultazione di dati, ai servizi web. Per utilizzare questo framework รจ perรฒ necessario imparare ad utilizzare Visual Studio, conoscere gli oggetti del .NET Framework e saper utilizzare un linguaggio di programmazione ad oggetti tra quelli messi a disposizione dal framework (nel nostro caso utilizzeremo C#).
ASP.NET รจ stato rilasciato per la prima volta nel Gennaio 2002 con la versione 1.0 del .NET Framework e presentato come successore della tecnologia Microsoft ASP (Active Server Pages). A differenza di questโultima tecnologia ASP.NET si basa, come tutte le applicazioni della famiglia Microsoft .NET, sul CLR (Common Language Runtime).
Il CLR consente agli sviluppatori di scrivere codice utilizzando uno qualunque dei linguaggi di alto livello supportati dal .NET Framework (C#, VB.NET, J#) ma anche altri linguaggi. Questo perchรจ il CLR aderisce agli standard ECMA (European Computer Manufacturers Association).
Il punto di forza delle applicazioni ASP.NET รจ che esse sono sensibilmente piรน performanti rispetto a quelle realizzate tramite linguaggi di programmazione interpretati grazie al fatto che il codice relativo viene precompilato in file gestiti dal server web.
Lโobiettivo fondamentale di tutto ciรฒ รจ quello di rendere lo sviluppo di applicazioni web piรน simile possibile allo sviluppo di applicazioni Windows. In ASP.NET infatti i controlli funzionano in modo similare ai corrispondenti controlli delle applicazioni Windows e, come questโultimi, consentono di gestire una grande varietร di eventi (si parla di modello event-driven). In pratica รจ ASP.NET che produce blocchi di codice HTML che vengono inseriti nella pagina che viene inviata al browser dellโutente finale, riproducendo il comportamento appropriato dei controlli.
Dopo il lancio della prima versione la tecnologia ASP.NET รจ stata ulteriormente migliorata e arricchita di nuove funzionalitร ed รจ oggi arrivata alla versione 4.0, includendo nuove funzionalitร che rappresentano la nuova frontiera dello sviluppo web moderno: LINQ, AJAX , Silverlight, WPF (Windows Presentation Foundation), WCF (Windows Communication Foundation) e WF (Windows Workflow Foundation).
Evoluzione delle applicazioni web
Come ben sappiamo Internet nacque come un esperimento volto a creare una rete permanente di informazioni e per tale motivo era rivolta fondamentalmente ad istituti accademici e governativi, con lโobiettivo di permettere ai ricercatori di tutto il mondo di condividere determinate informazioni.
La vera rivoluzione di Internet ebbe inizio con la creazione del primo browser HTML nel 1993. La prima generazione di siti web consisteva fondamentalmente in un insieme di pagine HTML statiche, aventi dunque un contenuto fisso che doveva essere aggiornato a mano da coloro che amministravano il sito stesso. Una pagina HTML consiste in un documento con un certo contenuto, formattato secondo opportune regole, che consentono la visualizzazione dello stesso sul nostro computer (attraverso un browser web).
Un documento HTML ha due tipi di contenuti che sono testi ed elementi (o tag) che indicano al browser di turno la formattazione da adottare. I tag sono facilmente riconoscibili, poichรจ sono delimitati dalle parentesi angolari (< >), Un esempio di codice HTML รจ il seguente
<html>
<head>
<title>Pagina web di prova</title>
</head>
<body>
<h1>Pagina web di prova</h1>
<p>Benvenuti in una pagina web di prova. </p>
</body>
</html>
Si tratta di una pagina che contiene un semplice titolo e una linea di testo e che in un browser verrร visualizzata nel modo seguente
Questa pagina non ha niente di interattivo, non richiede un server web e dunque non puรฒ essere considerata unโapplicazione web. Per cominciare a parlare di applicazioni web dobbiamo arrivare alla versione 2.0 del linguaggio HTML che ha portato allโintroduzione della tecnologia denominata HTML Form.
Questa tecnologia espande le funzionalitร dellโHTML di base includendo non soltanto tag per la formattazione dei contenuti, ma anche tag per componenti grafici, corrispondenti ai controlli delle applicazioni windows form: dropdown, textbox, checkbox, radiobutton, ecc.
Ecco un esempio di questo tipo di codice
<html>
<head>
<title>Pagina web di prova</title>
</head>
<body>
<form>
<input type="checkbox" />
Scelta A<br />
<input type="checkbox" />
Scelta B<br /><br />
<input type="submit" value="Invia" />
</form>
</body>
</html>
e la relativa pagina web
In un form HTML tutti i controlli sono posti tra i tag <form> e </form>. Nellโesempio precedente i controlli sono due checkbox e un button (tipo submit). Questo tipo di tecnologia consente di creare pagine per lโinput dei dati che consentono di inviare (ad esempio dopo il click del pulsante) tutti i dati inseriti ad un server web in unโunica stringa. Dal lato del server unโapposita applicazione riceve poi i dati e li elabora.
In pratica i controlli che oggi si utilizzano per le applicazioni web piรน avanzate sono gli stessi introdotti con lโHTML 2.0. La differenza รจ data dal tipo di applicazioni che girano sui server web. In passato infatti quando un utente cliccava sul pulsante di invio dei dati occorreva gestire tutti gli aspetti del trasferimento ad essi relativo, utilizzando ad esempio lo standard CGI (Common Gateway Interface). Oggi invece si occupa di tutto in modo molto piรน efficiente la piattaforma ASP.NET.
Per comprendere le motivazioni che hanno portato alla creazione di ASP.NET รจ necessario analizzare le problematiche legate alle prime tecnologie utilizzate nello sviluppo web. Con lo standard CGI originale, ad esempio, il server web deve lanciare una nuova istanza dellโapplicazione ad ogni richiesta (programmazione lato server) e se il sito web in questione รจ molto popolare il server risente pesantemente del peso di migliaia di istanze aperte contemporaneamente. Inoltre lโutilizzo di questo tipo di tecnologie comporta che per avere a disposizione funzionalitร di alto livello (come lโautenticazione o la consultazione di dati ottenuti da un database) occorre scrivere molto codice specifico, con il rischio di incorrere in errori di programmazione.
Proprio per evitare questi problemi Microsoft ha introdotto ASP.NET, una piattaforma di sviluppo di alto livello che permette ai programmatori di sviluppare pagine web dinamiche senza soffermarsi sui dettagli implementativi di basso livello. Tale piattaforma รจ stata sviluppata per fungere da framework per lo sviluppo di applicazioni web, fornendo migliori prestazioni e strumenti piรน avanzati rispetto alle tecnologie ad essa precedenti.
Accanto alla programmazione lato server si รจ andata affermando negli anni un altro tipo di programmazione, denominata lato client. In questo paradigma di programmazione vengono inserite nelle pagine applicazioni (create in JavaScript, ActiveX, Java o Flash per esempio) che non richiamano alcun processo lato server. In pratica le applicazioni vengono scaricate dal browser del client e vengono eseguite sulla macchina locale. Un problema di questo tipo di approccio รจ che le diverse tecnologie impiegate nello sviluppo di applicazioni possono non essere supportate allo stesso modo da tutti i sistemi operativi e browser. Per questo motivo i programmatori sono costretti a testare i propri siti web sui diversi sistemi esistenti.
La tecnologia ASP.NET รจ stata realizzata come tecnologia lato server. Infatti tutto il codice viene eseguito sul server e quando lโesecuzione termina lโutente riceve una pagina HTML ordinaria che puรฒ essere visualizzata in qualsiasi browser. Tuttavia la programmazione lato client non รจ stata completamente abbandonata. In alcuni casi infatti ASP.NET consente di combinare le caratteristiche positive di essa con le potenzialitร della programmazione lato server.
Il .NET Framework
Il .NET Framework รจ fondamentalmente un insieme di diverse tecnologie:
- Linguaggi .NET โ Visual Basic, C#, JScript.NET, J# e C++
- Common Language Runtime (CLR) โ Il motore che esegue tutti i programmi .NET e fornisce servizi alle varie applicazioni (come gestione della memoria e ottimizzazione delle prestazioni)
- .NET Framework Class Library โ Libreria che contiene migliaia di funzionalitร predefinite da utilizzare nelle nostre applicazioni
- ASP.NET โ Il motore che gestisce le applicazioni web create in .NET
- Visual Studio โ Ambiente di sviluppo che contiene di un ricco insieme di caratteristiche che favoriscono la produttivitร degli sviluppatori e semplificano il debugging delle applicazioni
Spesso la separazione tra queste componenti non รจ chiara e si tende a confondere le une con le altre. Di seguito unโ immagine tratta dal sito Microsoft che aiuta a comprendere meglio la suddivisione delle varie tecnologie allโinterno della Class Library
I linguaggi piรน utilizzati sono sicuramente C# e VB.NET. In particolare C# รจ un linguaggio relativamente nuovo progettato per la versione 1.0 di .NET. I due linguaggi utilizzano una sintassi differente ma entrambi sfruttano le funzionalitร della Class Library e sono supportati dal CLR.
Tutti i linguaggi .NET vengono compilati in un altro linguaggio di basso livello prima che il codice venga eseguito. Tale linguaggio รจ denominato Common Intermediate Language (CIL o semplicemente IL) e il CLR opera soltanto su questo tipo di codice. Le seguenti immagini tratte dal sito Microsoft illustrano come i linguaggi .NET vengano compilati in CIL e la struttura del CLR
Struttura del CLR
In pratica ogni file EXE (o DLL) generato tramite .NET contiene codice CIL e questi sono i file che vengono distribuiti sui pc client, nel caso di applicazioni windows form, o sui server web, nel caso di applicazioni web. Il CLR non ha idea di quale linguaggio sia stato utilizzato per generare il codice ed effettua unโaltra compilazione per trasformare il codice CIL in linguaggio macchina. Questo passaggio avviene quando il codice viene eseguito.
Il protocollo HTTP (in ambiente .NET)
Il meccanismo con cui i diversi browser comunicano con i siti web, come accennato in precedenza, si basa su un protocollo denominato Hypertext Transfer Protocol (HTTP). Nella sua forma originale questo protocollo รจ stato progettato per il trasferimento di documenti ipertestuali, ovvero documenti legati insieme ma senza una interfaccia utente ben definita, quello che รจ invece il punto di forza delle moderne applicazioni web.
HTTP รจ un protocollo che si basa su alcuni comandi di base. I piรน importanti di essi sono GET e POST, ma altri importanti comandi sono ad esempio HEAD e PUT. Il metodo GET restituisce lโinformazione identificata dallโ Uniform Resource Identifier (URI) specificato attraverso la richiesta (in pratica lโindirizzo del sito web). Il metodo POST serve ad inviare una richiesta al server web. Il comando HEAD restituisce solo le informazioni di testata identificate attraverso lโURI della richiesta. Anche il metodo PUT รจ utilizzato per inviare informazioni al server ma sotto forma di documenti e record anzichรฉ parametri.
Lโobiettivo della presente lezione non รจ quello di approfondire la conoscenza di HTTP, ma quello di spiegare come esso sia radicato allโinterno dellโambiente di sviluppo .NET. Tale ambiente include infatti diverse classi che consentono di effettuare richieste HTTP. La classe WebRequest, ad esempio, include un metodo, denominato GetResponse, che consente di inviare una richiesta ad un indirizzo specifico.
Per vedere come effettuare una richiesta diretta ad un server web senza un browser implementiamo un piccolo programma dโesempio. Avviamo Visual Studio e creiamo un nuovo progetto, scegliendo nella finestra di dialogo New Project il tipo di progetto Console Application
Aggiungiamo ora al programma appena generato il codice necessario ad effettuare richieste web. Visual Studio crea come punto di avvio dellโapplicazione un file denominato Program.cs.
Allโinterno di tale file aggiungiamo il seguente codice:
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
namespace WebRequestorApp
{
class Program {
static void Main(string[] args) {
WebRequest req = WebRequest.Create ("http://www.google.com");
WebResponse resp = req.GetResponse();
StreamReader reader = new StreamReader(resp.GetResponseStream(), Encoding.ASCII); Console.WriteLine(reader.ReadToEnd());
}
}
}
Avviamo lโapplicazione cliccando dal menรน Debug su Start Without Debugging e dopo qualche istante vedremo codice HTML sul nostro schermo. Chiaramente lโHTML visto in questo modo non รจ facilmente comprensibile e la sua interpretazione รจ riservata ai browser che hanno il compito di inviare richieste ai server web e ricevere la relativa risposta, rendendola comprensibile agli utenti. Questo esempio serve solo a mostrare le caratteristiche di base di una richiesta web.
Il fondamentalmente il lavoro di un browser consiste nel creare una richiesta e inviarla ad un server web (tramite il corrispondente URL) e nel ricevere la risposta, presentando la stessa in una forma comprensibile agli utenti. La risposta solitamente consiste in un flusso (stream) di testo contenente tag HTML.
Sviluppando applicazioni in ASP.NET ci capiterร di avere a che fare spessissimo con il codice HTML. La maggior parte di questo codice viene generata automaticamente dai controlli lato server (server-side controls) ma in alcuni casi saremo noi stessi a dover scrivere codice HTML per personalizzare le nostre pagine o per creare un controllo personalizzato secondo le nostre esigenze.
Per esempio il seguente codice HTML genera una pagina contenente un pulsante e un menรน a tendina:
<html>
<body>
<h2>Hello there. What's your favorite .NET feature?</h2>
<select name='Feature'>
<option>Type-Safety</option>
<option>Garbage collection</option>
<option>Multiple syntaxes</option>
<option>Code Access Security</option>
<option>Simpler threading</option>
<option>Versioning purgatory</option>
</select><br/>
<input type=submit name='Lookup' value='Lookup'></input>
<br/>
</body>
</html>
Si tratta di una pagina statica che consente di selezionare un valore e lavora soltanto localmente.
Internet Information Services (IIS)
Le prime applicazioni web residenti sui server avviavano un nuovo processo per ogni richiesta remota. Microsoft ha rivoluzionato questa concezione introducendo un singolo processo (chiamato servizio) che monitora la porta 80 in attesa di pacchetti di rete e carica le opportune librerie dinamiche (dynamik-link libraries, DLL) per la gestione di richieste separate. La piattaforma web standard di Microsoft รจ basata su Internet Information Services (IIS).
Fondamentalmente ogni applicazione web funziona allo stesso modo. Non importa quale piattaforma hardware o software si stia utilizzando ma deve essere sempre presente sul server un qualche tipo di software che monitori la porta 80 (quella tipicamente utilizzata) in attesa di richieste HTTP. Quando arriva una richiesta รจ compito del server rispondere alla stessa in qualche modo e sui sistemi operativi Microsoft รจ IIS il componente demandato a fare questo. Quando un browser effettua una chiamata ad un server con sistema Microsoft, IIS intercetta tale richiesta e ricerca la risorsa identificata tramite lโURL ricevuto.
IIS Suddivide la sua directory in diverse parti denominate directory virtuali. Per esempio supponiamo che qualcuno cerchi di accedere ad una risorsa web identificata dal seguente indirizzo:
http://www.miosito.com/prodotti/caratteristiche.htm
Chiaramente il dominio miosito รจ del tutto fittizio ma supponiamo che non lo sia. La parte http://www.miosito.com identifica il server di tale URL e invia la richiesta ad un labirinto di router. Quando la richiesta arriva al server esso verifica se la risorsa caratteristiche.htm รจ presente in una delle sue directory denominata prodotti. Se sul server gira IIS prodotti sarร una directory virtuale. Ogni directory virtuale tipicamente รจ correlata ad una singola applicazione e in pratica viene utilizzata per mappare una directory fisica (residente sul disco fisso del server) con un indirizzo internet. In questo modo IIS puรฒ gestire diverse applicazioni. Ogni directory virtuale include varie proprietร di configurazione tra cui anche opzioni di sicurezza, opzioni per la gestione degli errori e tante altre.
Sebbene per lo sviluppo di applicazioni ASP.NET non sia fondamentale conoscere le caratteristiche di IIS tale conoscenza diventa molto utile nel momento in cui ci si trovi ad effettuare il debug, il testing e la distribuzione di unโapplicazione web e pertanto adesso vedremo a grandi linee il suo funzionamento.
Per aprire lโinterfaccia utente di IIS basta andare nel Pannello di controllo , cliccare su Strumenti di amministrazione e poi su Internet Information Services. Si aprirร la seguente finestra (o molto simile, dipende dal vostro sistema operativo e dalla versione di IIS installata sul vostro computer)
Sulla sinistra รจ presente una struttura ad albero espandendo la quale รจ possibile visualizzare i siti web e le directory virtuali presenti sulla vostra macchina
Cliccando su un sito o una directory nella parte centrale della finestra viene visualizzato il relativo contenuto.
Cliccando con il tasto destro del mouse su un sito o una directory e selezionando la voce Proprietร si apre la finestra di configurazione in cui รจ possibile impostare diversi aspetti del sito e trarre anche molte utili indicazioni, come la versione di ASP.NET in uso sulla macchina
Chiaramente non รจ scopo di questa guida analizzare tutte le possibili opzioni di configurazione, tuttavia per i motivi suddetti vi consiglio di approfondire la conoscenza di IIS poichรจ successivamente vi potrร tornare molto utile.
I primi passi con ASP.NET
Il modo migliore per cominciare ad utilizzare ASP.NET รจ quello di creare una semplice applicazione. Per prima cosa creiamo una directory in cui inseriremo i file della nostra applicazione (nel mio caso C:esempioaspnet). Poi creiamo una directory virtuale in IIS, cliccando con il tasto destro su Sito web predefinito -> Nuovo -> Directory virtuale
Si apre la seguente finestra in cui dobbiamo inserire un nome per la nostra applicazione/sito web (nel mio caso SitoTest)
proseguendo si deve impostare il percorso fisico della cartella creata in precedenza (esempioaspnet)
infine impostiamo le autorizzazioni di accesso alla directory
In pratica lโalias SitoTest sarร il nome con cui lโapplicazione verrร conosciuta dal mondo esterno.
A questo punto dobbiamo creare la nostra prima pagina HTML. Possiamo utilizzare tranquillamente un editor come il Notepad, oppure utilizzare Visual Studio. Siccome si tratta di un esempio molto semplice basta il Notepad, dunque apriamo un nuovo documento e scriviamo il seguente codice:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Pagina SitoTest</title> </head>
<body>
<h1> Hello World </h1>
Ciao questa รจ una prova
</body>
</html>
salviamo il file con lโestensione htm (hello.htm) e inseriamolo nella directory C:esempioaspnet. A questo punto avviando un browser e digitando lโindirizzo http://localhost/SitoTest/hello.htm il risultato sarร il seguente.
In pratica il browser invia una richiesta HTTP al server per il file hello.htm e IIS restituisce il contenuto del file al browser. Poichรจ il testo contiene tag HTML il browser ne comprende il contenuto e visualizza correttamente quello che ci aspettiamo. Fino a questo momento perรฒ non siamo di fronte ad una pagine ASP.NET, ma ad una semplice pagina HTML.
Per effettuare la conversione da HTML a ASP.NET occorrono due passaggi: aggiungere in cima al file hello.htm una riga di codice (la direttiva Page) e rinominare il file stesso da hello.htm ad hello.aspx. In questo modo avremo una versione del nostro programma che opera utilizzando il framework ASP.NET
<%@ Page Language="C#" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Pagina SitoTest</title> </head>
<body>
<h1> Hello World </h1>
Ciao questa รจ una prova
</body>
</html>
Il risultato rimane visivamente invariato ma la direttiva Page viene utilizzata dallโambiente di esecuzione ASP.NET nella compilazione del file e suggerisce di compilare questo codice interpretando eventuali istruzioni poste al suo interno sottoforma di codice C#.
Eโ possibile inserire codice eseguibile nella nostra pagina semplicemente nel modo seguente:
<body>
<h1> Hello World </h1>
<%
.......
this.Metodo1();
this.Metodo2();
.......
%>
</body>
E ' anche possibile inserire blocchi di codice che deve essere eseguito sul server. Per fare ciรฒ si utilizza lโattributo runat:
<%@ Page Language="C#" Debug="true" %>
<script runat="server">
void MetodoTest() {
//Metodo che fa qualcosa
}
</script>
<html>
<body>
<h1>Hello World</h1>
<%
MetodoTest();
%>
</body>
</html>
Iniziamo a lavorare con Visual Studio
Visual Studio 2010 mette a disposizione diverse opzioni per il dislocamento dei nostri siti web durante lo sviluppo. La procedura di creazione guidata di un sito mette a disposizione le seguenti locazioni: IIS locale, file system, sito FTP e sito remoto. Ovviamente le diverse scelte dipendono degli scenari di utilizzo e adesso vedremo le differenze tra di esse.
IIS locale
Creare un sito web che gira su IIS locale รจ molto simile a ciรฒ che si faceva con le vecchie versioni di Visual Studio, specificando una directory locale virtuale. Questa opzione consente dunque di creare siti che vengono gestiti dallโIIS presente sul computer locale. Le pagine dei siti vengono memorizzate nella tipica directory Inetpubwwwroot.
File System
Questa opzione consente di sviluppare siti web ponendoli in qualsiasi cartella sul proprio computer o su una cartella condivisa di un altro computer. Questa opzione non richiede che sul computer sia installato IIS e lโesecuzione delle pagine avviene tramite il server web di Visual Studio. Questo รจ lโapproccio piรน comune nella creazione, sviluppo e test di siti web. Quando poi il sito รจ terminato basta creare una directory virtuale IIS sul server sul quale deve essere posizionato il sito e trasferire tutto il contenuto della cartella locale in tale directory.
FTP
Eโ possibile utilizzare Visual Studio per gestire siti web disponibili attraverso un server FTP. Se per esempio si lavora con una compagnia che offre servizi di hosting di siti web, un server FTP offre un modo comodo di trasferire i relativi file tra la nostra postazione di sviluppo e il server su cui risiede il sito. Visual Studio รจ in grado di connettersi con qualsiasi server FTP sul quale si dispone di privilegi di lettura e scrittura.
Siti web remoti
Questโultima opzione prevede lโutilizzo di un IIS su un computer accessibile attraverso la rete. Oltre ad IIS tale computer deve avere installato FrontPage 2002 Server Extensions. Questa opzione รจ utile quando un sito web viene sviluppato contemporaneamente da diverse persone che si trovano in luoghi diversi. Operando da remoto lโintero gruppo di sviluppo puรฒ lavorare simultaneamente. La controindicazione รจ che le operazioni di debugging e configurazione sono molto piรน lente che in locale.
I primi passi con Visual Studio
Per cominciare ad utilizzare Visual Studio 2010 creiamo unโapplicazione simile a HelloWorld vista nella lezione precedente. Per fare questo avviamo lโambiente di sviluppo e clicchiamo dal menรน File su New -> Web Site. Si apre la seguente finestra di dialogo in cui dobbiamo selezionare il tipo di progetto Empty Web Site
scegliamo inoltre come opzione Web location HTTP.
In base alle scelte fatte Visual Studio genera come impostazione predefinita un file di soluzione ASP.NET in una directory denominata VisualStudio2010Projects, posta nella cartella Documenti del computer in uso. Inoltre viene generata una directory virtuale in inetpubwwwroot che rappresenta la cartella fisica posta in Projects.
Se avessimo scelto come modello di progetto ASP.NET Web Site sarebbe stata creata una struttura simile con la differenza che sarebbero stati giร inclusi nel progetto un web form e il relativo file di codice (default.aspx e default.aspx.cs). Sarebbe inoltre stata creata automaticamente una cartella denominata App_Data da utilizzare per dati pertinenti al nostro sito.
A questo punto nella finestra Solution Explorer clicchiamo con il tasto destro del mouse sul nostro sito web e scegliamo lโopzione Add New Item
Nella finestra di dialogo che compare scegliamo lโelemento Web Form e diamogli il nome che vogliamo (nel mio caso Test.aspx)
Lasciamo le altre opzioni come sono anche se voglio soffermarmi un attimo sullโopzione Place code in separate file presente in basso a destra nella finestra di dialogo. Tale opzione in pratica indica a Visual Studio di creare un file .cs separato in cui porre il codice C# del web form.
Non mi soffermo piรน di tanto sul layout di Visual Studio perchรจ non รจ scopo di questa guida analizzarne i diversi componenti ma vi faccio notare in basso le tre tab Design, Split e Source. Cliccando sul tab Design รจ possibile visualizzare lโaspetto del web form in modo del tutto simile a quello che verrebbe visualizzato in un browser (in questo momento se clicchiamo sul tab Design del nostro web form chiaramente vedremo una pagina bianca). Cliccando su Source visualizziamo il codice HTML, mentre Split permette di visualizzare contemporaneamente la parte grafica e il codice HTML (la finestra viene suddivisa in due parti).
Se espandiamo il nodo relativo al nostro web form vedremo il file Test.aspx.cs in cui scrivere il nostro codice C#
Facendo doppio click su questo file si aprirร una pagina simile alla seguente
Nello stesso modo in cui abbiamo operato per il programma di esempio fatto con il Notepad possiamo creare nel file .cs un metodo:
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// ...
}
public void Metodo1()
{
// Fa qualcosa
}
}
e chiamarlo dal file .aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs"
Inherits="Test" %>
<!DOCTYPE html PUBLIC "
-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/
xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%
Metodo1();
%>
</div>
</form>
</body>
</html>
Quando compiliamo lโapplicazione Visual Studio compila il file .aspx e il file .cs e li pone nella directory temporanea ASP.NET. Successivamente IIS carica i file compilati (DLL) e mostra la pagina che abbiamo appena creato.
Utilizzo e gestione di controlli generici
Lo sviluppo di unโapplicazione web in Visual Studio รจ molto simile a quello di unโapplicazione desktop poichรจ con questo strumento di sviluppo non dobbiamo spendere molto tempo nella scrittura di codice complesso, che viene invece generato automaticamente tramite strumenti visuali. Per imparare ad utilizzare Visual Studio la cosa migliore รจ quella di sviluppare una semplice pagina web che utilizzi controlli lato server.
Avviamo dunque Visual Studio e creiamo un nuovo progetto di tipo Web Site. Clicchiamo nella finestra Solution Explorer con il tasto destro del mouse sul progetto appena creato e selezioniamo Add -> New Item. Nella finestra di dialogo che si apre selezioniamo Web Form e denominiamolo Default.aspx. A questo punto clicchiamo sul tab Design e siamo pronti a lavorare sulla nostra pagina
Visual Studio genera automaticamente il codice ASP.NET relativo alla pagina. Se clicchiamo sul tab Split il designer viene suddiviso in due parti, quella inferiore รจ la rappresentazione grafica della pagina mentre quella superiore รจ il corrispondente codice ASP.NET. Se inseriamo una frase nella parte grafica vedremo che simultaneamente Visual Studio lo inserirร nel codice ASP.NET
Per modificare il formato del testo รจ necessario agire sulle proprietร della pagina. Selezioniamo il testo, clicchiamo con il tasto destro sopra e selezioniamo la voce Properties. Nella finestra laterale Properties selezioniamo la voce Style e clicchiamo sul pulsante con i tre puntini (ellipsis). Si apre la finestra di dialogo Modify Style, tramite la quale possiamo impostare diverse proprietร
Scegliamo un tipo di carattere che ci piace e le relative dimensione e altezza e clicchiamo su OK
Notiamo ancora una volta come Visual Studio traduce in codice le impostazioni che abbiamo fatto
A questo punto trasciniamo sulla nostra pagina una label dalla finestra Toolbox
Nella finestra Properties relativa alla label appena inserita scriviamo nella proprietร Text la frase 'Scrivere qualcosaโ. Vedremo immediatamente che sia la pagina visuale sia il file aspx vengono aggiornati
Eโ chiaramente possibile personalizzare lโapparenza della label attraverso la finestra di dialogo Properties in modo del tutto analogo a quanto fatto per il web form.
Aggiungiamo ora una textbox accanto alla label e un dropdownlist sotto
Clicchiamo sullโopzione Edit Items nel menรน DropDownListTasks e si aprirร una finestra in cui inserire i valori che tale controllo dovrร presentare agli utenti
ad ogni elemento รจ possibile associare un testo (che sarร quello visualizzato in fase di esecuzione dellโapplicazione) e un corrispondente valore.
Aggiungiamo infine un button alla nostra pagina
Facciamo doppio click sul button e vedremo che nel file Default.aspx.cs verrร generato il corrispondente evento Click
Se guardiamo invece il codice ASP.NET generato da Visual Studio in seguito alle nostre operazioni di posizionamento dei controlli dovremmo vedere qualcosa del genere
cioรจ tutte le nostre operazioni fatte graficamente sono state tradotte in codice.
Se come ultimo passaggio vogliamo verificare il funzionamento dellโevento Click del button inseriamo in esso il seguente codice
Se avviamo ora lโapplicazione, inseriamo il testo 'ABCDEFโ nella textbox, selezioniamo lโelemento 'Treโ nella dropdownlist e clicchiamo sul button il risultato sarร il seguente
Chiaramente lo scopo della guida non รจ analizzare tutte le caratteristiche dei controlli a disposizione, poichรจ servirebbe una guida solo per questo, ma quello di farvi intuire la semplicitร con cui Visual Studio consente la gestione e lโutilizzo degli stessi. Per approfondire il funzionamento dei controlli utilizzati nella presente lezione e di tutti gli altri controlli generici vi invito a consultare la documentazione ufficiale Microsoft.
Utilizzo e gestione di controlli di validazione
Lโobiettivo fondamentale di ASP.NET e del .NET Framework รจ quello di rendere piรน semplice e veloce il lavoro dei programmatori. Per tale motivo nel framework sono state incluse diverse funzionalitร che in precedenza i programmatori dovevano gestire autonomamente, esponendosi a perdite di tempo e potenziali errori.
Uno scenario molto comune quando si naviga รจ quello di imbattersi in siti che includono pagine nelle quali gli utenti si trovino a dover inserire diversi tipi di informazioni. Per esempio per accedere ad una determinata sezione di un sito web gli utenti potrebbero dover inserire username o password o per ricevere determinate informazioni devono fornire un indirizzo email valido (contenete @, dominio, ecc).
Colui che gestisce un sito del genere deve dunque poter contare su una logica che assicuri che le informazioni inserite siano valide. Siccome non รจ possibile che nel 100% dei casi gli utenti inseriscano dati assolutamente validi รจ necessario validare le informazioni inserite. Per esempio certi campi possono essere obbligatori, altri possono richiedere che i dati inseriti rispettino un certo formato (come il suddetto indirizzo email), altri ancora che il dato inserito sia compreso in un certo intervallo e cosรฌ via.
Chiaramente questi controlli potrebbero essere effettuati dai programmatori scrivendo codice ad hoc ma ASP.NET fornisce un metodo piรน semplice e veloce: i controlli di validazione. Questi operano in stretta relazione con i controlli standard (come le textbox) presenti nei web form e permettono di ottenere messaggi di errore o avvertimento se gli utenti inseriscono infermazioni che potrebbero essere non corrette.
ASP.NET include sei controlli di validazione:
- RequiredFieldValidator: assicura che un campo non sia vuoto
- RangeValidator: assicura che il valore contenuto in un campo sia compreso in un certo intervallo
- RegularExpressionValidator: valida i dati presenti in un campo confrontando la loro struttura con un modello predefinito (es. lโindirizzo email)
- CompareValidator: assicura che il valore contenuto in un campo corrisponda ad uno specifico valore
- CustomValidator: permette di impostare delle funzioni di validazione personalizzate
- ValidationSummary: permette di visualizzare un elenco di tutti gli errori di validazione presenti in una pagina
Tutti i controlli di validazione operano allo stesso modo. Prima si pone un controllo standard sulla pagina web e poi si pone il controllo di validazione che si preferisce nel punto in cui dovrร coparire lโeventuale messaggio dโerrore. I controlli di validazione presentano una proprietร denominata ControlToValidate, nella quale bisogna impostare il nome del controllo che deve essere validato. Impostata questa proprietร tutto funziona automaticamente, anche se ovviamente occorre configurare il messaggio che deve essere restituito ed รจ possibile anche configurare diverse altre proprietร .
I controlli di validazione operano sui seguenti controlli server: TextBox, ListBox, DropDownList, RadioButtonList, HtmlInputText, HtmlInputFile, HtmlSelect, HtmlTextArea, FileUpload. Per comprendere meglio che funzionano come al solito facciamo un esempio.
Apriamo il sito di prova creato nella lezione precedente o creiamone uno nuovo. Aggiungiamo un web form denominato Validazione.aspx che ospiterร i controlli standard e i relativi controlli di validazione. Supponiamo che sia una pagina in cui un ipotetico utente deve inserire nome, cognome, etร , numero di telefono e password (in due diversi campi per confermare che sia corretta). Inseriamo pertanto tante textbox quanti sono i campi, le relative label e un pulsante per lโinvio delle informazioni inserite
Adesso inseriamo i controlli di validazione. Poniamo i RequiredFieldValidator ognuno accanto ai campi Nome, Cognome, Etร , Telefono, Password e Conferma Password impostando la proprietร ControlToValidate sulle rispettive textbox ed impostando i messaggi dโerrore
Infine inseriamo nella pagina un ValidationSummary che ci permetterร di visualizzare contemporaneamente tutti i messaggi dโerrore. Eโ inoltre possibile impostare la proprietร ShowMessageBox di tale controllo al valore true per ricevere anche una segnalazione visuale degli errori. A questo punto avviamo lโapplicazione e se clicchiamo sul pulsante di invio dei dati senza inserire alcuna informazione vedremo qualcosa del genere
Se proviamo ad inserire delle informazioni in alcuni campi vedremo che alcuni messaggi (quelli relativi ai campi compilati) non appariranno piรน
In questo esempio abbiamo utilizzato solo i RequiredFieldValidator ma chiaramente lโutilizzo degli altri tipi di controlli di validazione รจ simile. Come al solito vi invito a consultare la documentazione ufficiale Microsoft per approfondire lโargomento.
Utilizzo e gestione di controlli grafici
Le pagine web contengono spesso diverse immagini e il linguaggio HTML utilizza un opportuno tag (img) per indicare al browser di caricare unโimmagine e visualizzarla. ASP.NET rende trasparente ai programmatori lโuso del tag img tramite lโutilizzo del controllo server Image che permette di gestire file di questo tipo traducendo in codice le sue impostazioni.
Utilizzare il controllo Image รจ molto semplice, basta trascinarlo dal Toolbox su un web form come tutti gli altri controlli HTML. Effettuata questa operazione viene generato un tag <img/>
In aggiunta a tale controllo ASP.NET mette a disposizione altri due controlli molto utili: ImageButton, รจ un pulsante in cui si puรฒ impostare come sfondo unโimmagine; ImageMap, che consente di mappare unโimmagine e dividerla in zone che reagiscono diversamente in base al click dellโutente (si pensi ad esempio ad una cartina geografica in cui cliccando sulle diverse regioni si apre una pagina con le relative caratteristiche).
Creiamo un nuovo web form e trasciniamo dal Toolbox un controllo Image in esso. Nella finestra Properties del controllo inseriamo un percorso ad unโimmagine presente sul nostro computer nella proprietร ImageUrl. In pratica se clicchiamo sul pulsante a destra di tale proprietร comparirร una finestra di dialogo con gli elementi presenti nel nostro progetto (quindi prima inseriamo lโimmagine nel progetto). Ad esempio io ho aggiunto lโimmagine Collineazzurre.jpg al mio progetto e la posso selezionare in tale finestra
dopo aver cliccato su OK ecco come apparirร la pagina
Avviando lโapplicazione vedremo nel nostro browser una pagina contenente solo lโimmagine.
Adesso aggiungiamo un controllo ImageButton alla nostra pagina. Come accennato in precedenza si tratta di un pulsante che รจ possibile decorare con una certa grafica. Tramite questo controllo รจ possibile gestire tre possibili scenari: nel primo lโImageButton funziona come un semplice Button al quale รจ possibile collegare lโevento Click sul server; nel secondo รจ possibile definire uno script lato client e collegare la proprietร OnClientClick del controllo a tale script; nel terzo รจ possibile indicare al controllo di inviare la prossima richiesta ad una pagina specifica attraverso la proprietร PostBackUrl. Anche in questo controllo รจ necessari valorizzare la proprietร ImageUrl per indicare lโimmagine da visualizzare
Se nella proprietร OnClientClick scriviamo Test il codice ASP.NET verrร modificato nel modo seguente
e quando si cliccherร sul pulsante verrร cercato lo script Test (otterrete un errore se lo script non esiste)
Se invece nella proprietร PostBackUrl scriviamo ~/Validazione.aspx (la pagina creata qualche lezione fa) al click del pulsante verremo reindirizzati a tale pagina.
Adesso aggiungiamo un controllo ImageMap e impostiamo come proprietร ImageUrl unโimmagine qualunque (io utilizzo di nuovo "Colline azzurre.jpg"). Tra le proprietร del controllo vi รจ anche Hotspots. Clicchiamo su tale proprietร e vedremo una finestra in cui รจ possibile definire i cosiddetti hotspot (aree interattive) dellโimmagine. Il pulsante Add permette di scegliere che tipo di hotspot inserire (circolare, rettangolare o poligonale). Inseriamo un hospot rettangolare
Impostiamo dei valori per il posizionamento e una stringa (Prova) nella proprietร AlternateTex
Avviando lโapplicazione; posizionando il mouse nella zona definita comparrirร il testo Prova e cliccando verremo indirizzati alla pagina Validazione.aspx (impostata nella proprietร NavigateUrl)
Interfaccia utente e master pages
Un segno distintivo dei moderni siti web รจ sicuramente la cura nei dettagli e la semplicitร di uso delle varie pagine che li compongono. Per esempio i siti piรน apprezzati si basano su schemi di colore e insiemi di caratteri uguali in ogni pagina ed inoltre forniscono semplici e intuitivi strumenti di navigazione tra le pagine stesse. Del resto sarร capitato un pรฒ a tutti di accedere a siti aventi pagine tutte diverse tra loro e di difficile consultazione, ecco questo รจ quello che dobbiamo evitare per i nostri siti.
La soluzione per dare alle pagine di un sito un aspetto comune รจ quella di creare una classe primaria dalla quale tutte le pagine del sito derivino. Siccome ASP.NET si basa su un modello incentrato sulla classe Page basta implementare una pagina primaria (Primary Page) le cui proprietร saranno ereditate dalle pagine del nostro sito
Tutte le pagine .aspx derivano dalla pagina primaria che a sua volta deriva da System.Web.UI.Page. La pagina primaria si occupa del caricamento degli elementi comuni tra le varie pagine e successivamente ogni singola pagina si occupa del resto.
Lo strumento messo a disposizione da ASP.NET per realizzare questo tipo di struttura รจ la cosiddetta Master Page. Queste pagine sono del tutto simili ad una tipica pagina di un sito e vengono definite in file con estensione .master.
Una master page serve dunque come un modello e quando un utente naviga su una pagina che dipende da una master page le richieste e le risposte sono filtrate da questโultima. ASP.NET unisce poi la master page e la pagina di contenuti (.aspx) in unโunica classe. Quando la pagina di contenuti viene richiesta la master page inserisce il proprio contenuto nel file .aspx sottoforma di un controllo che viene aggiunto alla collection di controlli della pagina.
Vediamo adesso come fare a definire e utilizzare una master page. Avviamo Visual Studio e creiamo un nuovo progetto di tipo Empty Web Site. Aggiungiamo un nuovo elemento di tipo Master Page al nostro progetto
La pagina a livello visuale รจ simile ai normali web form visti nelle lezioni precedenti e il codice generato da Visual Studio รจ il seguente
Vi faccio notare che รจ stato inserito il controllo ContentPlaceholder di cui parleremo in seguito. Per il resto la master page puรฒ essere personalizzata a nostro piacimento come una normale pagina del nostro sito.
Per esempio andiamo a modificare il tag body impostando un colore di sfondo (background) diverso
la master page adesso ha uno sfondo grigio (#bbbbbb).
Aggiungiamo adesso al nostro progetto un nuovo elemento di tipo web form (lo chiamo Default.aspx), spuntando in basso nella finetra di dialogo Add New Item lโopzione Select master page
Cliccando su OK ci veine presentata unโaltra finestra di dialogo nella quale possiamo selezionare la master page per la pagina che stiamo aggiungendo al progetto (nel nostro caso ce ne sarร soltanto una)
Se andiamo a guardare nel tab Design la pagina Default.aspx vedremo che essa ha lo stesso colore di sfondo della master page e questo dimostra che la pagina ha ereditato le impostazioni del modello.
Questo รจ il codice generato da Visual Studio per la pagina Default.aspx
in esso si vede il riferimento alla pagina MasterPage.master.
A questo punto noi possiamo creare tutte le pagine che vogliamo (ognuna con contenuti personalizzati) e le dobbiamo legare alla nostra master page. Se successivamente andremo a modificare il contenuto della master page in unโunica operazione saranno aggiornate tutte le pagine che dipendono da essa.
Chiaramente quello presentato รจ un semplice esempio ma che lascia intuire la potenzialitร di questi strumenti, soprattutto allโinterno di siti con una grafica complessa.
Temi e skin
Come abbiamo visto le master page influiscono sulla struttura generale di una serie di pagine allโinterno di unโapplicazione (o sito) web. Tuttavia quasi sempre nellโimplementazione di un sito si ha la necessitร di gestire altri elementi che possono cambiare da pagina a pagina ma devono mantenersi costanti allโinterno di una stessa pagina (come il tipo di carattere dei testi). In tali scenari uno strumento molto utile sono i cosiddetti Temi.
Se avete una certa familiaritร con i Cascading Style Sheets (CSS) non vi verrร difficile comprendere il funzionamento dei temi. Le due tecniche infatti sono similari poichรจ con entrambe รจ possibile definire lo stile visuale delle nostre pagine web. Eโ possibile utilizzare i temi per specificare stili, elementi grafici ed altri elementi nelle pagine dei nostri siti.
I temi sono fondamentalmente dei file testuali che specificano le caratteristiche che gli elementi di una pagina devono assumere e ASP.NET ne include diversi predefiniti, anche se รจ possibile ovviamente definirne di personalizzati.
Procediamo con un esempio. Creiamo un nuovo web form (io lo chiamo EsempioTemi.aspx) e successivamente clicchiamo con il tasto destro del mouse sul nostro progetto e scegliamo lโopzione Add ASP.NET Folder e scegliamo come tipo di cartella Theme
Questa operazione porta alla creazione della cartella App_Themes con allโinterno una cartella predefinita (denominata Theme1)
Rinominiamo la cartella Theme1 in Default e clicchiamo su di essa con il tasto destro del mouse, aggiungendo un nuovo elemento di tipo StyleSheet (foglio di stile). Denominiamo lo stesso Default.css
A questo punto dobbiamo impostare le caratteristiche del nostro foglio di stile. Se facciamo doppio click su di esso vedremo che contiene soltanto un tag body
Per aggiungere nuovi elementi clicchiamo sullโopzione Add Style Rule del menรน Styles
Si apre la seguente finestra
Supponiamo di voler inserire un elemento H1 al nostro foglio di stile. Selezioniamo nel menรน a tendina Element lโelemento h1 e clicchiamo sul pulsante > per inserirlo nella lista Style rule hierarchy
Cliccando su OK vediamo immediatamente che il foglio di stile viene modificato nel seguente modo
Per modificare lโelemento appena inserito clicchiamo con il tasto destro del mouse sul relativo tag e scegliamo lโopzione Build Style. In questo modo si apre la finestra Modify Style, nella quale andiamo ad impostare alcune proprietร a nostro piacimento
Dopo aver cliccato su OK vediamo le nostre scelte inserite nel foglio di stile
Testiamo adesso il nostro tema aggiungendo al web form creato allโinizio della lezione la direttiva Theme e scrivendo qualcosa allโinterno di tag h1
Il testo che ho inserito io รจ Test applicazione stile ed esso verrร visualizzato nel browser in base alle ipostazioni del nostro foglio di stile
La stessa cosa avverrร per tutti gli elementi della nostra pagina racchiusi tra tag h1. Chiaramente abbiamo utilizzato questo tag come esempio ma in linea di principio in modo del tutto simile รจ possibile personalizzare tutti gli elementi di un web form.
Infine vorrei soffermarmi brevemente anche sulle cosiddette skin. Questi elementi rappresentano un modo di configurare alcune proprietร di un gruppo di controlli. Per esempio si potrebbero voler definire diversi schemi di colori per un particolare tipo di controllo (come TextBox) caratterizzato da diverse proprietร personalizzabili.
Definendo le opportune skin รจ possibile rendere disponibili un certo numero di opzioni di visualizzazione per un gruppo di controlli senza la necessitร di impostare le proprietร di ogni istanza di ciascuno di essi. Se ad esempio un web form contiene dieci TextBox e si vuole dare ad esse una certa formattazione basta definire lโopportuna skin e assegnarla ad ognuna delle caselle di testo. Quindi il file di una skin definisce uno specifico tipo di controllo e gli attributi da applicare a tutte le istanze dello stesso.
Vediamo un esempio. Creiamo una nuova cartella denominata Skins allโinterno della cartella Default vista in precedenza e aggiungiamo al suo interno un nuovo elemento di tipo skin denominato TestSkinFile
Nel file generato inseriamo delle personalizzazioni per alcuni controlli come le seguenti
In questo modo quando aggiungeremo ad un web form gli elementi definiti nella skin essi assumeranno le caratteristiche impostate. Ovviamente affinchรจ avvenga questo รจ necessario dichiarare la skin allโinterno della pagina, in modo analogo a quanto fatto in precedenza per il tema.
I file di configurazione: machine.config e web.config
Un aspetto importante delle applicazioni web รจ la gestione delle informazioni di configurazione, ambito che include diversi elementi tra cui:
- Session state
- Caching
- Tracing
- Autenticazione
Questi elementi sono controllabili attraverso un certo numero di parametri configurabili. Per esempio quando in unโapplicazione si abilita il session state (stato della sessione) รจ possibile stabilire dove collocare tale gestione, potendo scegliere ad esempio tra un processo o un computer separato (utilizzando Windows Service o SQL Server). Eโ inoltre possibile configurare la durata dello stato della sessione e le modalitร in cui lโapplicazione deve tenere traccia di tali informazioni (ad esempio tramite cookie).
Anche il caching รจ un elemento molto importante poichรจ quando si decide di mettere in cache i contenuti del proprio sito web questa caratteristica permette di configurare la durata della permanenza dei contenuti nella cache e la posizione in cui devono essere memorizzati (sul server, sul client, sul proxy).
Le opzioni di configurazione di queste due funzionalitร vengono gestite tramite opportuni file di configurazione. Nelle prime versioni di ASP.NET modificare la configurazione di unโapplicazione web significava operare direttamente sul file di configurazione in formato XML. Fortunatamente invece le piรน recenti versioni di ASP.NET (dalla 2.0 in poi) mettono a disposizione due strumenti che rendono la configurazione di unโapplicazione web molto piรน semplice. Il primo strumento รจ la sezione ASP.NET Configuration disponibile in IIS (versione 7), il secondo รจ il Web Site Administration Tool disponibile in Visual Studio (che vedremo piรน avanti).
I file di configurazione .NET sono file XML con un contenuto che viene compreso dallโambiente di esecuzione del .NET Framework. In fase di esecuzione questi file vengono letti per impostare i vari parametri necessari e tali parametri sono cumulativi. Per esempio il file di configurazione web.config viene caricato quando viene avviata lโapplicazione ma il primo file di configurazione che viene esaminato รจ il machine.config e le impostazioni dei due file vengono seguite entrambe.
Il file machine.config solitamente รจ posto nel percorso C:WindowsMicrosoft.NETFrameworkvxxxxxConfig (dove xxxxx รจ la versione del .NET Framework). Questo file imposta il comportamento predefinito di tutte le applicazioni .NET eseguite sul computer locale. Di seguito un esempio di tale file
Si nota la presenza di diverse sezioni di configurazione. Tra le varie รจ possibile ad esempio trovare la seguente
che indica allโambiente di esecuzione ASP.NET di utilizzare la Forms Authentication (una delle opzioni di autenticazione disponibili) per autenticare gli utenti del sito. Viene inoltre specificato di utilizzare SQL Server per la gestione del session state, con un timeout di 25 minuti, e di tracciare tale stato direttamente nellโURI.
Il machine.config dunque permette di gestire le impostazioni predefinite del nostro computer e questo ha determinati effetti su tutte le applicazioni .NET. Per tale motivo non รจ generalmente una buona idea apportare modifiche dirette al file. In alternativa le applicazioni windows form .NET dipendono anche da un file di configurazione separato e denominato solitamente come lโeseguibile delle stesse (se ad esempio lโeseguibile dellโapplicazione si chiama miaapplicazione.exe il file di configurazione associato sarร miaapplicazione.exe.config). Le applicazioni web .NET invece dipendono da un file denominato web.config. Tali file devono essere inclusi nella cartella in cui risiede lโapplicazione.
Un esempio di file web.config รจ il seguente
Nelle versioni di ASP.NET precedenti alla 2.0 i file web.config dovevano essere modificati manualmente senza alcuno strumento di supporto che assicurasse che quello che si scriveva al loro interno fosse corretto.A partire da ASP.NET 2.0 invece รจ disponibile in Visual Studio un nuovo strumento denominato Web Site Administration Tool (WSAT).
Vediamo brevemente come funziona. Creiamo un nuovo progetto web in Visual Studio o apriamone uno giร esistente (vanno bene quelli creati in precedenza) e dal menรน Website clicchiamo su ASP.NET Configuration
Si apre la seguente pagina di configurazione
attraverso cui รจ possibile modificare il file web.config senza dover scrivere il codice manualmente. Clicchiamo per esempio sul tab Applicazione e al suo interno clicchiamo sul link Crea Impostazioni Applicazioni
Inseriamo unโimpostazione denominata Proprietario il cui valore sia Pippo e salviamo
Se andiamo a guardare il web.config vedremo che la nuova impostazione รจ stata inserita automaticamente
In modo del tutto simile รจ possibile configurare le impostazioni di sicurezza e le impostazioni del provider tramite le altre tab presenti nella pagina.
Gestire la sicurezza delle applicazioni ASP.Net
Spesso un sito web contiene delle pagine che non devono essere disponibili ad essere consultate da chiunque, ma soltanto da determinati tipi di utenti. Si parla di autenticazione degli utenti in riferimento alla pratica utilizzata per verificare che gli utenti siano effettivamente quelli che dicono di essere e tale pratica si basa su unโinformazione condivisa (come una password). Si parla invece di autorizzazione degli utenti in riferimento alla pratica di consentire o negare in base a permessi e/o ruoli loro assegnati il permesso di accedere a certe pagine a determinati utenti che si sono autenticati.
La sicurezza del software รจ un argomento di grande attualitร in negli ultimi anni. Quando unโapplicazione web viene eseguita in un ambiente Microsoft occorre considerare alcuni fondamentali aspetti: il contesto di sicurezza (security context) di IIS, la modalitร di autenticazione degli utenti ed i relativi permessi.
Gestire la sicurezza sul web รจ unโattivitร molto simile alla tipica gestione della sicurezza di una rete in cui bisogna basarsi sullโautenticazione e sulle autorizzazioni degli utenti. Tuttavia la sicurezza sul web contempla la gestione di client che utilizzano diverse piattaforme, quindi si dispone di un controllo minore rispetto ad una rete chiusa (come la rete Windows di un ufficio). In una rete chiusa infatti un amministratore puรฒ piรน facilmente sorvegliare lโintero sistema, garantendo o negando lโaccesso dei vari utenti alle risorse disponibili. Gli utenti di unโapplicazione web invece sono molto piรน numerosi ed รจ quindi necessario un altro approccio (esterno allโinfrastruttura Windows) per autenticare ed autorizzare gli stessi.
Il prima problema relativo alla sicurezza che si incontra sviluppando applicazioni web in ambiente Windows รจ quello di comprendere il contesto di sicurezza di IIS. Virtualmente tutti gli accessi ad un sito web passano attraverso IIS e, come tutte le applicazioni Windows, IIS viene eseguito in uno specifico contesto. Quando IIS viene installato su un computer il processo di installazione crea una identitร di sicurezza (security identity) separata per esso.
Eโ possibile individuare lโidentitร sotto la quale la nostra versione di IIS gira avviandolo, selezionando una directory virtuale, accedendo alla finestra delle proprietร e cliccando su Controllo autenticazione e accesso remoto. A questo punto si apre la seguente finestra
come potete vedere sul mio computer lโidentitร รจ IUSR.
Come impostazione predefinita IIS gestisce le directory virtuali utilizzando lโAnonymous Authentication. Quando รจ specificata tale modalitร IIS utilizza lโutenza che abbiamo appena visto e rende disponibili le risorse da essa accessibili. IIS supporta anche altri tipi di autenticazione, tra cui lโautenticazione Windows. In questโultimo caso รจ necessario fornire a tutti i potenziali utenti nome utente e password di Windows. Tuttavia questo tipo di autenticazione funziona bene con utenti che utilizzano sistemi Windows ma per gli utenti che utilizzano altri sistemi operativi รจ necessario utilizzare un altro tipo di autenticazione, poichรจ il meccanismo di sicurezza disponibile agli utenti Windows non รจ disponibile per gli altri sistemi e dunque gli utenti non potrebbero autenticarsi.
Fortunatamente perรฒ ASP.NET include la cosiddetta Forms Authentication, un semplice ma efficace strumento introdotto nella verisone 1.0. Esso viene impostato dal file web.config di unโapplicazione web che, oltre agli elementi giร visti, contiene anche i nodi di autenticazione e di autorizzazione. In assenza di tali nodi ASP.NET consente un accesso senza limitazioni ad un sito web. Se invece questi elementi sono presenti gli utenti vengono reindirizzati ad una pagina dedicata allโautenticazione (tipicamente una pagina di login in cui gli utenti devono inserire username e password).
Ecco un esempio di web.config con i suddetti nodi
in esso si puรฒ vedere che รจ stato impostato come metodo di autenticazione Form e come pagina alla quale gli utenti vengono reindirizzati la pagina login.aspx.
ASP.NET include un grande supporto per lโautenticazione degli utenti. Lโelemento fondamentale in tale contesto รจ la classe FormsAuthentication, la quale fornisce una serie di diverse funzionalitร che vanno dalla crittografia delle password, alla creazione di cookie di autenticazione, passando per tutta una serie di altri aspetti
Per approfondire la tematica della sicurezza in ambiente ASP.NET vi invito a consultare un articolo scritto da me e presente a questa pagina.
Gestione degli utenti
ASP.NET e Visual Studio forniscono anche utili strumenti per la gestione dellโidentitร e dei ruoli degli utenti di un sito web. Per vedere come fare creiamo un nuovo sito web e quindi accediamo alla pagina ASP.NET Configuration che abbiamo visto qualche lezione fa. In essa selezioniamo la tab Provider e clicchiamo sul link Selezionare un unico provider per tutti i dati di gestione del sito
quindi clicchiamo sul link Prova per verificare che la connessione funzioni
e se tutto รจ a posto dovrebbe comparirvi la seguente pagina
Per assicurarsi che il database funzioni clicchiamo poi sulla tab Sicurezza e aggiungiamo un utente direttamente da qui, cliccando su Crea utente ed inserendo i relativi dati nella seguente finestra
Eโ anche possibile cambiare il tipo di autenticazione sempre dalla tab Sicurezza cliccando sul link Seleziona tipo di autenticazione e scegliendo una delle due opzioni disponibili (scegliamo la prima opzione)
Sempre nella tab Sicurezza clicchiamo su Abilita ruoli
e poi su Crea o gestisci ruoli
Creiamo due ruoli: Admin e Utente
A questo punto andiamo a creare altri utenti nel modo visto in precedenza (io creo gli utenti Vincenzo e Paolo). Notiamo che a differenza di prima adesso accanto allโutente รจ possibile selezionare i ruoli cui esso deve appartenere e io assegno allโutente Vincenzo il ruolo Admin e allโutente Paolo il ruolo Utente
Se andiamo ad aprire il file web.config vedremo in esso i parametri di autenticazione che abbiamo impostato
Dobbiamo adesso andare ad impostare le autorizzazioni di accesso alle varie risorse del sito per i vari ruoli e/o utenti. Sempre attraverso la tab Sicurezza clicchiamo allora su Crea regole di accesso e tramite la seguente pagina
potremo impostare i privilegi nel modo desiderato. Per esempio possiamo negare lโaccesso agli utenti anonimi spuntando lโopzione Utenti anonimi e lโopzione Nega. Cosa che determina lโinserimento nel web.config del seguente codice
Nella prossima lezione vedremo come gestire i controlli per il login.
Utilizzo e gestione di controlli per il login
Le ultime versioni di ASP.NET mettono a disposizione un certo numero di controlli per lโaccesso ai siti web che coprono la maggior parte degli scenari possibili. Questi controlli includono: Login, LoginView, PasswordRecovery, LoginStatus, LoginName, ChangePassword e CreateUserWizard.
Descriviamo brevemente le loro caratteristiche:
Login
Eโ il piรน semplice tra i controlli di questa categoria e supporta i piรน comuni scenari di login. Esso include due textbox per lโinserimento di username e password, un checkbox per il salvataggio della password sul computer locale e un pulsante per lโinvio dei dati
Il controllo espone diverse proprietร attraverso cui รจ possibile personalizzarne lโaspetto ed รจ anche possibile inserire link per la gestione della registrazione degli utenti e per il recupero delle password. Lโinterazione con la componente di autenticazione ASP.NET รจ settata come impostazione predefinita ma รจ anche possibile gestire lโautenticazione in modo autonomo attraverso lโevento Authenticate del controllo.
LoginView
Si tratta di un controllo molto utile per gestire i contenuti da visualizzare a seconda che lโutente si sia autenticato o meno. Esso permette di visualizzare lo stato del login in base allo stato dellโutente.
PasswordRecovery
Eโ uno strumento molto utile in quei siti che inviano nuovamente la password agli utenti che la dimenticano. Questo controllo memorizza i nomi degli account utente e propone una domanda di sicurezza, inviando lโemail con la password se ad essa viene fornita una risposta valida.
LoginStatus
Si tratta di un link cliccando sul quale si viene reindirizzati alla pagina di login (se lโutente non รจ attualmente autenticato) o si effettua il logout (se lโutente risulta autenticato).
LoginName
Pemette di visualizzare il nome dellโutente correntemente autenticato.
ChangePassword
Eโ uno strumento che consente agli utenti di modificare la propria password. Questa operazione รจ possibile se lโutente รจ in grado di fornire la vecchia password.
CreateUserWizard
Questo controllo consente la creazione guidata di un nuovo utente raccogliendo le informazioni necessarie allo scopo. Esso infatti richiede varie informazioni relative al nuovo utente tra cui password da impostare, indirizzo email, domanda di sicurezza e relativa risposta.
Chiaramente in tutte le immagini di esempio ho lasciato il testo in inglese proposto ma ovviamente รจ possibile personalizzare tutte le label e i messaggi a proprio piacimento.
Quando si crea un nuovo sito web ASP.NET genera un modello che contiene giร quattro web form per la gestione delle operazioni di login
Questi web form sono Register.aspx, Login.aspx, ChangePassword.aspx e ChangePasswordSuccess.aspx. Questi form contengono giร una versione predefinita di alcuni dei controlli che abbiamo appena visto. Se avviamo lโapplicazione senza toccare nulla la pagina che ci comparirร รจ quella di login
Come giร detto, quando si autentica un utente in pratica si stabilisce la sua identitร . Sebbene tale informazione spesso sia molto utile un sistema diviene piรน sicuro quando lโautenticazione viene combinata con lโautorizzazione degli utenti, cioรจ stabilire con precisione cosa gli utenti possono fare allโinterno delle pagine del nostro sito. Per gestire questi aspetti possiamo utilizzare lo strumento Web Site Administration Tool che abbiamo giร visto in una delle lezioni precedenti.
Data binding
In ASP.NET un certo numero di controlli possiede la capacitร di comprendere la forma ed il contenuto di una collezione e di generare i giusti tag per rappresentare la stessa. Tra di essi possiamo citare, ad esempio, listbox e dropdownlist.
Uno dei problemi piรน comuni nello sviluppo di qualsiasi software applicativo o sito web รจ quello di rappresentare collezioni/insiemi di elementi in opportune interfacce utente (UI, User Interface). Pensiamo ad uno dei tanti siti commerciali presenti sul web. Quando accediamo ad uno di essi se vogliamo comprare qualcosa ci troviamo solitamente a compilare una scheda, nella quale tra i vari dati solitamente รจ presente la nazione di appartenenza. Questo campo viene solitamente rappresentato attraverso una dropdownlist, un menรน a tendina che permette di visualizzare lโelenco delle nazioni e selezionarne una.
La domanda fondamentale รจ: come viene popolato questo controllo? Controlli come questo (ma anche listbox per esempio) espongono la collezione Items, attraverso cui รจ possibile aggiungere gli elementi da elencare. Basta utilizzare il metodo Items.Add
protected void PopolaDropDownList(IList lista)
{
for(int i = 0; i < lista.Count; i++)
{
this.MiaDropDownList.Items.Add(lista [i]);
}
}
Tuttavia come si puรฒ comprendere lโaggiunta manuale degli elementi ad un controllo non รจ una strada consigliabile in determinati contesti (si pensi ad esempio a insiemi di elementi da visualizzare che possono cambiare nel tempo) e per tale motivo ASP.NET include un certo numero di controlli di collegamento ai dati (data bound) capaci di prendere collezioni di elementi e di generare automaticamente i tag per la loro visualizzazione al posto nostro (il cosiddetto data binding).
Ognuno di questi controlli include opportune proprietร per il collegamento ad una sorgente dati (data source). Per data binding semplici si utilizza la proprietร DataSource, alla quale รจ possibile collegare qualsiasi collezione/insieme che implementi le interfacce IEnumerable, ICollection o IListSource. Dopo aver valorizzato tale proprietร รจ possibile รจ possibile invocare il metodo DataBind sulla pagina (o sul controllo) per indicare al controllo di iterare sulla collezione collegata.
I controlli che supportano tale funzionalitร sono: listcontrol, checkboxlist, radiobuttonlist, dropdownlist, listbox, treeview, menu, gridview, datagrid, repeater, formview, detailsview. Chiaramente per gli scopi della presente guida non potremo approfondire le caratteristiche di ciascuno di essi e per fare ciรฒ vi invito a consultare la documentazione ufficiale Microsoft.
Vediamo un esempio di utilizzo di alcuni di questi controlli. In Visual Studio creiamo un nuovo sito web e aggiungiamo ad esso una classe Auto dotata di due proprietร Marca e Modello che, come รจ facile intuire, ci servirร come una collezione di marche e modelli di auto.
Ecco di seguito la sua implementazione
public class Auto
{
public string Marca { get; set; }
public string Modello { get; set; }
public Auto(string strMarca,
string strModello)
{
this.Marca = strMarca;
this.Modello = strModello;
}
public static List<Auto> CreaListaAuto()
{
List<Auto> lAuto = new List<Auto>();
Auto sAuto;
sAuto = new Auto("Lancia","Delta");
lAuto.Add(sAuto);
sAuto = new Auto("Fiat","Punto");
lAuto.Add(sAuto);
sAuto = new Auto("Audi","A4");
lAuto.Add(sAuto);
sAuto = new Auto("Mercedes","SLK");
lAuto.Add(sAuto);
sAuto = new Auto("Ferrari","F399");
lAuto.Add(sAuto);
sAuto = new Auto("Ford","Kuga");
lAuto.Add(sAuto);
return lAuto;
}
}
Aggiungiamo un nuovo web form denominato Default.aspx al nostro progetto ed inseriamo in esso quattro dei controlli che abbiamo visto in precedenza e cioรจ una listbox, una dropdownlist, una radiobuttonlist e una checkboxlist
Impostiamo la proprietร AutoPostBack a true per tutti i controlli in modo che selezionando un elemento venga generato un evento di postback durante il quale lโelemento puรฒ essere interrogato. Inseriamo inoltre in una posizione qualsiasi della pagina una label che ci servirร in seguito. Adesso dobbiamo modificare la pagina per collegare la classe che restituisce la collezione di auto ai vari controlli. Per ogni controllo impostiamo la proprietร DataTextField sul campo Modello, in modo che i modelli delle auto compaiano nei vari controlli. Impostiamo poi la proprietร DataValueField sul campo Marca. Infine nellโevento Load della pagina inseriamo il seguente codice per la creazione della collezione di auto e per la relativa associazione ai vari controlli
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
List<Auto> autoList = Auto.CreaListaAuto();
this.ListBox1.DataSource = autoList;
this.DropDownList1.DataSource = autoList;
this.RadioButtonList1.DataSource = autoList;
this.CheckBoxList1.DataSource = autoList;
this.DataBind();
}
}
Avviando lโapplicazione ecco come apparirร ciascun controllo
A questo punto possiamo collegarci allโevento SelectedIndexChanged dei vari controlli per evidenziare come accedere alle informazioni relative alla marca delle auto. Siccome la procedura รจ simile facciamo un esempio solo per la listbox. Generiamo quindi il relativo evento SelectedIndexChanged ed inseriamo al suo interno il seguente codice
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.Label1.Text = this.ListBox1.SelectedValue;
}
In questo modo avviando lโapplicazione vedremo che selezionando i diversi modelli di auto la label verrร valorizzata con la corrispondente marca
Gestire le connessioni a database con ADO.NET
Nella lezione precedente abbiamo visto come legare una collezione statica (detta anche in-memory) a vari controlli lato server. Sebbene questo tipo di operazione possa essere utile in determinati contesti tuttavia spesso si presenta la necessitร di legare i vari controlli a collezioni di elementi di altra origine, molto spesso provenienti da un database.
Oltre ad includere librerie di classi per lo sviluppo di applicazioni desktop (Windows Form) e per la gestione di richieste HTTP (ASP.NET), il .NET Framework include anche una libreria che supporta la connessione ad una grande varietร di database e che รจ denominata ADO.NET (Active Data Object .NET). Tale tecnologia si fonda su tre funzionalitร principali: connessione ad un database, interrogazione di un database e gestione dei risultati.
Quando si vuole interagire con un database รจ necessario connettersi allo stesso. La connessione richiede lโidentificazione della posizione del database ma puรฒ richiedere anche la gestione della sicurezza e di altri spetti complessi. Tutti questi elementi vengono gestiti come parte del processo di connessione ad un database. Le informazioni per la connessione vengono di solito passate sotto forma di una stringa, il cui contenuto viene utilizzato per il settaggio di vari parametri.
Mentre in passato era necessario scrivere manualmente il codice per lโaccesso ad un database, tramite ADO.NET basta specificare il tipo di database a cui si desidera connettersi e automaticamente vengono impostati gli oggetti idonei a quel tipo di connessione.
Sono diversi i tipi di database supportati:
- ODBC Data Provider
- OLE DB Data Provider
- OracleClient Data Provider
- SqlClient Data Provider
- SQL Server CE Data Provider
Questi tipi dono definiti nel giร citato file machine.config
<configuration>
<configSections>
<section name="system.data.odbc"
type="
System.Data.Common.DbProviderConfigurationHandler, ..."/>
<section name="system.data.oledb"type="
System.Data.Common.DbProviderConfigurationHandler, ..."/>
<section name="system.data.oracleclient" type="
System.Data.Common.DbProviderConfigurationHandler, ..."/>
<section name="system.data.sqlclient" type="
System.Data.Common.DbProviderConfigurationHandler, ... "/>
<configSections />
<system.data>
<DbProviderFactories>
<add name="Microsoft SQL Server Compact Data Provider" invariant="
System.Data.SqlServerCe.3.5"
type=" System.Data.SqlServerCe.SqlCeProviderFactory ... " />
</DbProviderFactories>
</system.data><
/configuration>>
Per creare la connessione ad un database occorre dunque utilizzare il giusto componente. Avendo a disposizione una connessione รจ possibile poi utilizzarlo per accedere al database. Se ad esempio sul nostro computer locale risiede un database di SQL Server denominato DB_TEST occorre inserire in una eventuale nostra applicazione la seguente stringa di connessione
<configuration>
<connectionStrings>
<add name="TEST"
connectionString= "server=(local);
integrated security=sspi;database= DB_TEST "/>
</connectionStrings>
</configuration>
A questo punto รจ possibile aprire la connessione e avere a disposizione il database per lโesecuzione delle operazioni che vogliamo.
La maggior parte dei database supportano il linguaggio SQL (Structured Query Language) per effettuare interrogazioni, modifiche, nuovi inserimenti e cancellazioni di dati. Tali comandi solitamente hanno una forma simile alla seguente
SELECT * FROM Clienti WHERE Cognome = 'Rossi'
dove Clienti รจ una tabella di un database. Questo comando richiede una lista dei clienti il cui cognome รจ Rossi. Per ottenere questi dati allโinterno di una nostra applicazione dovremmo scrivere il seguente codice
class TestDBApp
{
static void Main()
{
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
using (DbConnection conn = dbProviderFactory.CreateConnection())
{
string s = ConfigurationManager.ConnectionStrings["TEST"].ConnectionString;
conn.ConnectionString = s;
conn.Open();
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM Clienti WHERE Cognome = 'Rossi'";
DbDataReader reader = cmd.ExecuteReader();
//Utilizzare il reader per accedere ai dati
}
}
}
Lโesecuzione del comando (cmd) tramite il metodo ExecuteReader causa lโinvio della nostra query al database. I risultati in questo caso vengono ottenuti attraverso unโistanza della classe IDatareader, ma รจ possibile gestirli anche tramite unโaltra classe denominata DataSet.
Lโinterfaccia IDataReader รจ indicata per effettuare iterazioni sui risultati di una query. In particolare essa espone il metodo Read che scorre le righe una alla volta in modo sequenziale.Lo svantaggio รจ che durante la scansione non esiste la possibilitร di tornare ad una riga precedente ed inoltre le righe restituite sono in sola lettura quindi non รจ possibile modificarne i contenuti.
Lโalternativa a IDataReader รจ la classe DataSet, che consente la gestione di un insieme disconnesso di dati. ADO.NET รจ stato progettato in primo luogo per supportare applicazioni molto scalabili e uno dei problemi principali della scalabilitร รจ il limite al numero di connessioni ad un database. I database infatti spesso hanno un limite sul numero di connessioni contemporaneamente attive e se in un determinato momento tutte quelle consentite risultano in uso le operazioni vengono rallentate. Se il numero di utenti del sistema รจ allโincirca uguale al numero di connessioni contemporaneamente disponibili potrebbero non verificarsi problemi rilevanti, ma se il numero di utenti รจ maggiore le prestazioni del sistema potrebbero risentirne drammaticamente.
Proprio per risolvere tali problemi ADO.NET mette a disposizione la classe DataSet, progettata per fornire una sorta di copia del database (o porzione di esso) utilizzato da unโapplicazione. I vantaggi sono molteplici, basti pensare che allโinterno di unโistanza di dataset รจ possibile inserire nuovi dati, aggiornare o cancellare quelli esistenti e confermare poi tutte queste operazioni che vengono eseguite in modalitร disconnessa connettendosi al database per un breve periodo di tempo.
La classe DataSet include un array di oggetti DataTable, che vengono popolati tramite i DataAdapter. Questi elementi quando vengono invocati caricano i dati estratti dal database direttamente allโinterno delle DataTable e successivamente รจ possibile lavorare su tali dati in locale, interagendo con il database solo al momento di confermare le modifiche apportate agli stessi.
Quindi utilizzando la classe DataSet abbiamo la possibilitร di accedere ad ogni elemento presente in essa in modo del tutto casuale, diversamente da quanto abbiamo visto per il componente DbDataReader.
Controlli per la gestione dei dati
Dopo aver visto le modalitร con cui accedere ai dati attraverso ADO.NET adesso vediamo come accedere agli stessi in modo ancora piรน facile e veloce. Infatti ASP.NET include diverse classi che limitano la complessitร della gestione delle connessioni e del trasferimento dei dati, ossia i cosiddetti controlli DataSource.
Questi controlli rendono trasparente al programmatore tutto il meccanismo di connessione e di generazione dei comandi e tutto quello che bisogna fare รจ stabilire la sorgente dati (data source), puntare i controlli interessati su tale origine dati e fornire una query appropriata. Visual Studio fornisce una procedura guidata che permette di gestire facilmente questi passaggi. Una volta creato un controllo DataSource รจ possibile collegarlo a qualsiasi componente per la gestione di dati.
Come al solito vediamo un esempio. Aggiungiamo ad un nostro progetto un nuovo web form e dal Toolbox trasciniamo su di esso un controllo SqlDataSource. Clicchiamo su Configure Data Source nel relativo context menu
Si apre una finestra in cui รจ possibile selezionare un database esistente o crearne uno nuovo tramite il pulsante New Connection. Nel mio caso io seleziono il database di prova di tipo SQL Server CE denominato MioDB presente sul mio computer locale ma chiaramente รจ possibile selezionare qualsiasi database
Proseguiamo e in uno dei passaggi successivi specifichiamo di prelevare i dati da una tabella residente sul database (nel mio caso la tabella Amici) e selezioniamo le colonne relative (nel mio caso Id, Nome e Eta)
Nella schermata successiva รจ anche possibile testare la query cliccando su Test Query e infine clicchiamo su Finish. Adesso andiamo ad impostare la proprietร DataSourceMode sul valore DataReader
Inseriamo nel nostro form un controllo ListBox e spuntiamo lโopzione Enable AutoPostBack
Clicchiamo poi su Choose Data Source e nella relativa finestra di dialogo selezioniamo il controllo che abbiamo creato in precedenza specificando quale campo deve essere visualizzato nella lista e quale campo invece deve indicare il corrispondente valore
Avviando lโapplicazione visualizzeremo una lista relativa ai dati della tabella che abbiamo impostato come origine dati. Il collegamento tra la listbox e lโorigine dati, che abbiamo fatto tramite la finestra appena vista, avremmo potuto farlo anche scrivendo il seguente codice nellโevento Load del form
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.ListBox1.DataSource = this.SqlDataSource1;
this.ListBox1.DataTextField = "Nome";
this.ListBox1.DataValueField = "Id";
this.ListBox1.DataBind();
}
}
Questo semplice esempio serve soltanto a dare unโidea delle potenzialitร degli strumenti messi a disposizione da ASP.NET per la gestione dei dati. In questo caso abbiamo utilizzato un controllo semplice, come listbox, ma esistono molti controlli piรน complessi per la gestione dei dati, che consentono di visualizzare gli stessi in diversi modi. Questi controlli includono: GridView, FormView, DetailsView, DataList. Chiaramente non รจ obiettivo di questa guida approfondire i dettagli di questi controlli e, come sempre, vi rimando alla documentazione ufficiale Microsoft per approfondire il loro funzionamento.
Interrogare i dati con LINQ
Con le ultime versioni del .NET Framework รจ stata introdotta una nuova tecnologia a livello di interazione con i databse denominata LINQ (Language Integrated Query). Si tratta di un insieme di estensioni del .NET Framework per effettuare rapide interrogazioni sui dati. LINQ estende la sintassi di C# e Visual Basic ma non rimpiazza le altre tecnologie per lโaccesso ai dati, rappresentando unโutile alternativa alle stesse.
Questa tecnologia รจ denominata 'linguaggio integratoโ perchรจ offre la possibilitร di costruire le query desiderate integrandole nella sintassi di linguaggi di programmazione ben definiti come C# e Visual Basic.
Per comprenderne le potenzialitร procediamo con un esempio. Aggiungiamo un nuovo web form ad un nostro progetto e inseriamo un controllo GridView allโinterno dello stesso per la visualizzazione dei dati derivanti dalla query LINQ che eseguiremo prossimamente. In questโesempio utilizzeremo come origine dati la classe Auto che abbiamo visto qualche lezione fa (aggiungendo un altro modello della casa Ford, la Focus).
Nellโevento Load del form inseriamo il seguente codice
if (!this.IsPostBack)
{
List<Auto> autoList = Auto.CreaListaAuto();
GridView1.DataSource = from auto in autoList
where
auto.Marca.Contains("Ford") == true
orderby auto.Marca.Length
select auto.Modello.ToUpper();
GridView1.DataBind();
}
Con questa sintassi stiamo chiedendo di riportare in griglia solo i modelli di auto di marca Ford e infatti eseguendo lโapplicazione il risultato visualizzato sarร il seguente
Se modifichiamo il codice per visualizzare anche la marca dobbiamo scrivere
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
List<Auto> autoList = Auto.CreaListaAuto();
GridView1.DataSource = from auto in autoList
where
auto.Marca.Contains("Ford") == true
orderby auto.Modello.Length
select auto;
GridView1.DataBind();
}
}
e il risultato sarร il seguente
Tirando le somme il formato di una istruzione LINQ รจ il seguente
from <variabile in una collezione> in <collezione>
where <criteri di selezione>
orderby <criteri di ordinamento>
select <proprietร degli elementi selezionati>
La cosa piรน interessante รจ che con LINQ possiamo eseguire query (ma anche modificare i dati) sfruttando un modello indipendente dalle varie tipologie di fonti. Eโ possibile infatti accedere a database, file di testo, file XML, array, file Excel, file di configurazione, informazioni su assembly, chiavi di registro e qualsiasi altro oggetto riconducibile ad una collezione di oggetti enumerabile.
Esistono diverse varianti di questa tecnologia, tra cui:
- LINQ to Objects โ Permette di eseguire delle query su collezioni di oggetti in memoria
- LINQ to XML โ Permette di eseguire delle operazioni su informazioni in formato XML
- LINQ to DataSet โ Permette di eseguire delle query su DataSet tipizzati
- LINQ to SQL โ Permette di rappresentare un grafo di oggetti in memoria che rappresentano gli oggetti presenti in un database SQL Server, su cui poi eseguire delle query
In particolare la tecnologia piรน utilizzata รจ LINQ to SQL per approfondire la quale vi rimando ad un articolo scritto da me qualche tempo fa che potete trovare a questa pagina.
Gestire il Session State
Lo sviluppo e la distribuzione di applicazioni web richiede il monitoraggio dello stato delle stesse in ogni momento. Uno degli stati piรน importanti รจ quello associato alla sessione (session state) e ASP.NET fornisce un grande supporto per la sua gestione.
A questo punto della guida dovrebbe essere chiaro che nella programmazione web le applicazioni sviluppate servono utenti multipli, distribuiti in una larga area, basandosi su un protocollo disconnesso (HTTP).
Quando il session state รจ abilitato ASP.NET crea per ogni richiesta un nuovo oggetto Session, che diventa parte del contesto ed รจ accessibile attraverso la pagina. A tale oggetto viene assegnato un identificatore ed esso diviene un comodo contenitore di informazioni la cui durata รจ superiore a quella della pagina cui si riferisce.
Lโoggetto Session รจ un dizionario di coppie nome/valore e tramite esso รจ possibile associare qualsiasi oggetto ad una chiave in modo da potervi accedere quando fosse necessario, utilizzando proprio la chiave relativa.
Se per esempio volessimo memorizzare alcune informazioni relative ad un utente in un oggetto Session dovremmo scrivere qualcosa del genere
void StoreInfoInSession()
{
String strInputUtente = TextBox1.Text;
Session["strInputUtente "] = strInputUtente;
}
e se in una successiva richiesta volessimo recuperare tale valore dovremmo scrivere
void GetInfoFromSession()
{
String strInputUtente = Session["strInputUtente "] ;
TextBox1.Text = strInputUtente;
}
Gestire il session state in ASP.NET รจ estremamente conveniente, anche perchรจ in tale tecnologia questo tipo di oggetto puรฒ essere collocato in diversi posti: nel processo corrente, su un server di stato separato, su un database SQL Server.
Per comprendere meglio come funziona il session state vediamo un esempio in cui creeremo un sito web con una pagina che memorizzi un valore come elemento del session state. In questo modo risulterร chiara la differenza tra lo stato di una pagina durante una richiesta e le informazioni associate ad una sessione che, come detto, persistono anche in seguito alla richiesta.
Creiamo una nuova applicazione web e nel web form Default.aspx inseriamo una text box per inserire il valore da memorizzare nel session state. Aggiungiamo anche due button, uno per memorizzare i dati e uno per visualizzare lo stato
Inseriamo accanto alla text box anche una label per visualizzare il dato che richiameremo in seguito. Inseriamo una variabile di tipo string allโinterno della nostra pagina e nel Page_Load impostiamo il valore di questa stringa nella nostra text box
string sessionString;
protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = this.sessionString;
}
Facendo doppio click sul pulsante Memorizza generiamo il corrispondente evento Click e al suo interno inseriamo il codice che recupera la stringa contenuta nella text box e la memorizza nella variabile sessionString, impostando la label accanto con lo stesso testo
protected void MemorizzaBtn_Click(object sender, EventArgs e)
{
this.sessionString = this.TextBox1.Text;
this.Label1.Text = this.sessionString;
}
Avviamo lโapplicazione e scriviamo qualcosa nella text box e clicchiamo su Memorizza. Dovremmo vedere qualcosa del genere
Se clicchiamo sul pulsante Visualizza la label assume un valore di stringa vuota in quanto la variabile sessionString viene instanziata nuovamente (poichรจ la pagina viene ricreata). Questo perchรจ abbiamo impostato che nel Page_Load la proprietร Text della label sia impostata sul valore della variabile sessinString. Come abbiamo piรน volte accennato infatti, le pagine sono oggetti dalla vita molto breve, corrispondente alla durata di una richiesta e poi vengono distrutte con tutti i dati presenti in esse. Se quindi lโobiettivo รจ quello di memorizzare qualche dato che vada oltre la durata di una pagina lโapproccio appena visto non va bene.
Lโutilizzo del session state รจ il modo di risolvere tale problema. Per spiegare meglio il concetto aggiungiamo una seconda label al nostro web form e poniamola sotto quella giร presente
Questa seconda label ci servirร per visualizzare i dati recuperati tramite lโoggetto Session. Modifichiamo lโevento MemorizzaBtn_Click in modo che il testo prelevato dalla text box venga pure memorizzato nellโoggetto Session
protected void MemorizzaBtn_Click(object sender, EventArgs e)
{
//Memorizza il valore nella variabile locale
this.sessionString = this.TextBox1.Text;
//Memorizza il valore nell'oggetto Session
this.Session["sessionString"] = this.TextBox1.Text;
//Mostra il valore della variabile
this.Label1.Text = this.sessionString;
//Mostra il valore della sessione
this.Label2.Text = (string)this.Session["sessionString"];
}
Modifichiamo anche lโevento Page_Load in modo che nella seconda label imposti la stringa recuperata dallโoggetto Session
protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = this.sessionString;
this.Label2.Text =(string)this.Session["sessionString"];
}
Avviamo ora lโapplicazione e scriviamo nuovamente qualcosa nella text box, cliccando poi sul pulsante Memorizza. Dovremmo vedere qualcosa del genere
Se adesso clicchiamo su Visualizza vedremo che la prima label verrร impostata su stringa vuota, mentre la seconda manterrร il valore
Mentre il valore della variabile locale si perde, poichรจ la pagina viene ricreata, il valore memorizzato nellโoggetto Session persiste e puรฒ essere consultato.
Per quanto riguarda la configurazione dei vari parametri per la gestione del session state vi invito a consultare la documentazione ufficiale Microsoft.
Caching dei dati
Il caching dei dati รจ un utile strumento per il miglioramento delle prestazioni di qualsiasi sistema software. Lโidea consiste nel porre i dati piรน frequentemente utilizzati in un dispositivo molto performante. Infatti sebbene il tempo di accesso alle periferiche di memorizzazione di massa continui a migliorare, accedere ai dati residenti ad esempio su un hard disk รจ ancora unโoperazione molto piรน lenta che accedere ad essi mentre si trovano in memoria. Rendere quindi disponibili in modo rapido i dati piรน utilizzati contribuisce significativamente a migliorare le prestazioni delle nostre applicazioni.
In ASP.NET la Cache รจ parallela alle nostre applicazioni ed รจ disponibile attraverso HttpContext e System.Web.UI.Page. Utilizzare la Cache รจ molto simile a quanto visto per lโoggetto Session, poichรจ รจ possibile accedere agli oggetti contenuti in essa tramite un indicizzatore. In aggiunta รจ anche possibile controllare la durata degli oggetti ed impostare dei collegamenti tra gli oggetti in cache e i dati fisici di origine.
La gestione della cache in ASP.NET รจ estremamente semplice e per vedere come fare procediamo con un esempio. Supponiamo di avere un metodo GetData() che effettua una connessione ad un database e restituisce una datatable
protected DataTable GetData()
{
DataTable dt = null;
dt = new DataTable();
string strConnection = "Stringa di connessione al DB";
DbProviderFactory f =
DbProviderFactories.GetFactory("System.Data.SqlClient");
using (DbConnection conn = f.CreateConnection())
{
conn.ConnectionString = strConnection;
conn.Open();
DbCommand command = f.CreateCommand();
command.CommandText = "Select * from NomeTabella";
command.Connection = conn;
IDataReader reader = command.ExecuteReader();
dt.Load(reader);
reader.Close();
conn.Close();
}
return dt;
}
Abbiamo anche un altro metodo BindData() che associa i dati restituiti dal metodo GetData() ad una DataList presente in un nostro web form
protected DataTable BindData()
{
DataTable dt;
dt = this.GetData();
this.DataList1.DataSource = dt;
this.DataBind();
return dt;
}
un altro metodo che ci serve per il nostro esempio รจ CreaTabella che restituisce la struttura di una tabella in base ad un determinato schema
protected DataTable CreaTabella(DataTable tableSchema)
{
DataTable tabella = new DataTable();
foreach (DataColumn dc in tableSchema.Columns)
{
tabella.Columns.Add(dc.ColumnName,
dc.DataType);
}
return tabella;
}
I metodi GetData() e BindData() vengono chiamati nellโevento Page_Load nel modo seguente
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = BindData();
DataTable elementiTabella = this.CreaTabella(dt);
Session["elementiTabella"] = elementiTabella;
}
}
e quindi ogni volta che la pagina viene creata viene effettuata la connessione al database e vengono ricaricati i dati. In un contesto in cui le richieste provengono da pochi client la cosa potrebbe essere accettabile, per applicazioni dimensionate per soddisfare le richieste di migliaia di client questo non รจ accettabile. Infatti le operazioni di accesso al database dono molto onerose a livello temporale e dovrebbero essere ridotte al minimo.
A questo punto possiamo fare alcune valutazioni sulla natura dei dati gestiti dalla nostra applicazione. Domandandoci se รจ proprio necessario ricaricare tali dati ogni volta se essi non cambiano spesso. Se tale necessitร non รจ presente possiamo pensare di memorizzare tali dati su un supporto che consenta un accesso agli stessi molto veloce e senza bisogno di connessioni al database (per esempio la memoria interna del computer). In questo modo lโapplicazione potrebbe soddisfare molte piรน richieste contemporanee da parte dei client. Ovviamente se i dati trattati dalla nostra applicazione cambiassero molto spesso questโapproccio non sarebbe opportuno.
I passi per effettuare il caching dei dati sono:
- Verificare se un determinato dato si trova in cache
- Se รจ presente in cache utilizzarlo
- Se non รจ presente in cache connettersi al database per ottenerlo
- Memorizzare lโelemento appena caricato in cache per eventuali usi futuri
A questo punto andiamo a modificare i metodi che abbiamo visto nella parte iniziale della presente lezione per gestire il caching dei dati. Ecco il metodo GetData() modificato
protected DataTable GetData()
{
DataTable dt = null;
dt = (DataTable)Cache["TabellaInCache"];
if (dt == null)
{
dt = new DataTable();
string strConnection = "Stringa di connessione al DB";
DbProviderFactory f = DbProviderFactories.GetFactory("System.Data.SqlClient");
using (DbConnection conn = f.CreateConnection())
{
conn.ConnectionString = strConnection;
conn.Open();
DbCommand command = f.CreateCommand();
command.CommandText = "Select * from NomeTabella";
command.Connection = conn;
IDataReader reader = command.ExecuteReader();
dt.Load(reader);
reader.Close();
conn.Close();
}
}
Cache["TabellaInCache"] = dt;
return dt;
}
Nel nuovo metodo GetData() viene prima effettuato un controllo sullโesistenza della tabella in cache. Se la tabella non esiste if (dt == null) essa viene creata come veniva fatto in precedenza, ma se esiste la parte di connessione al database ed estrazione dei dati viene completamente bypassata. In ogni caso prima di restituire la tabella essa viene memorizzata in cache (Cache["TabellaInCache"] = dt;). Queste piccole modifiche riducono significativamente il costo del caricamento della pagina (se chiaramente รจ stata giร creata una volta).
Chiaramente la presente lezione รจ volta a farvi intuire le potenzialitร del caching dei dati e per approfondire le varie modalitร di gestione della cache, i relativi metodi disponibili e capire quali di essi possono esservi utili di volta in volta vi invito a consultare la documentazione ufficiale Microsoft.
Diagnostica e debugging degli errori
Le architetture e le tecniche di programmazione moderne hanno reso lo sviluppo software molto piรน standardizzato e controllabile rispetto al passato, grazie a librerie come ASP.NET e Windows Form. Tuttavia inevitabilmente in alcuni casi le applicazioni non si comportano come previsto e in tali situazioni diviene fondamentale individuare le relativa cause.
Il punto di partenza per la diagnosi e il debugging delle applicazioni ASP.NET รจ il cosiddetto page tracing. La classe Page possiede una proprietร chiamate Trace e quando essa viene impostata a true si indica allโambiente di esecuzione di inserire un resoconto dellโintero contesto di richieste e risposte alla fine del codice HTM inviato al client
Ricordiamo che una pagina รจ composta da un certo numero di controlli posti in una sorta di gerarchia. Una istanza della classe Page ingloba diversi controlli e i controlli stessi possono inglobare altri controlli. Il page trace include una sezione in cui รจ possibile consultare la composizione della pagina in termini di controlli lato server.
Se in uno dei web form di una nostra applicazione abilitiamo il page tracing nel file .aspx troveremo il relativo riferimento nella direttiva Page
Se avviamo lโapplicazione vedremo le informazioni relative al page tracing alla fine dello stream HTML
Scendendo nella pagina possiamo visualizzare lโalbero gerarchico dei controlli contenuti in essa
Piรน in basso รจ poi possibile consultare alcune informazioni associate alla richiesta come lo stato della sessione, lo stato dellโapplicazione, le variabili lato server, ecc. Ovviamente non รจ immediato comprendere lโutilitร di tali informazioni ma quando ci si trova a dover individuare particolari problematiche allโinterno di unโapplicazione web piรน complessa allora esse potrebbero risultare molto utili.
Volevo farvi notare che tra le varie informazioni incluse nello stream HTML vi sono anche i riferimenti alle singole istruzioni eseguite allโinerno della pagina. Se nellโevento load del web form che abbiamo utilizzato nel nostro esempio precedente scriviamo qualcosa del genere
protected void Page_Load(object sender, EventArgs e)
{
Trace.Warn("Page_Load", "Test di annotazione chiamata");
}
avviando nuovamente lโapplicazione ecco quello che vedremo
Tramite il metodo Trace.Warn รจ possibile dunque inserire determinati indicatori allโinterno del nostro codice per individuare potenziali problemi.
Sebbene il tracing di una singola pagina sia molto utile esso presenta la controindicazione di riempire la pagina anche di informazioni tutto sommato inutili. Per aggirare questo problema รจ possibile applicare il tracing a livello di applicazione (application tracing), che permette di ottenere le stesse informazioni di quello a livello di pagina ma esse vengono poste in memoria e rese disponibili attraverso una pagina separata.
Per attivare lโapplication tracing occorre modificare il file web.config della nostra applicazione nel modo seguente
<configuration>
<system.web>
<trace enabled="true"/>
</system.web>
</configuration>
Fatto questo se avviamo lโapplicazione e aggiungiamo allโindirizzo corrispondente il suffisso Trace.axd ecco quello che vedremo
ovvero le stesse informazioni viste in precedenza ma su una pagina separata.
Tirando le somme dunque il tracing รจ uno strumento molto utile per il debugging delle nostre applicazioni , soprattutto perรฒ quando esse sono giร distribuite. Quando si รจ invece in fase di sviluppo porre messaggi da tracciare e poi eseguire le applicazioni per vedere cosa succede probabilmente non รจ il modo piรน efficiente di effettuarne il debugging.
Visual Studio fornisce un eccellente supporto al debugging ed รจ possibile sfruttare gli strumenti messi a disposizione dallโambiente di sviluppo per analizzare il codice delle nostre applicazioni in fase di esecuzione linea per linea.
Per abilitare il debugging di una nostra applicazione ASP.NET occorre che il file web.config contenga la seguente direttiva
<configuration>
<system.web>
<compilation debug="true"
targetFramework="4.0"/>
</system.web>
</configuration>
A questo punto possiamo piazzare uno a piรน breakpoint nei punti del nostro codice che vogliamo analizzare e avviare lโapplicazione premendo F5. Vedremo che quando lโesecuzione del codice arriverร ad uno dei breakpoint essa si arresterร , consentendoci di scorrere il codice linea per linea cliccando sul tasto F10. La linea di codice in esecuzione risulta evidenziata in giallo
Cliccando su F11 in corrispondenza di un metodo si passerร ad analizzare il codice del metodo in questione. Nella fase di debugging se fermiamo il puntatore del mouse su una variabile ci viene mostrato il suo valore
Altri utili strumenti di per il debugging sono le finestre: Locals, Watch, CallStack e Threads per approfondire le funzionalitร delle quali vi rimando alla documentazione ufficiale Microsoft.
Strettamente legata al debugging รจ la gestione degli errori e per approfondire questo argomento vi rimando ad un articolo precedentemente scritto da me che potete trovare qui.
Introduzione ad AJAX
AJAX (acronimo che sta per Asynchronous JavaSCript and XML) รจ una tecnologia introdotta dalla piattaforma ASP.NET con lโobiettivo di migliorare lโaspetto delle applicazioni web e lโinterazione tra esse e gli utenti. Nellโambito del software quando una tecnologia sembra essere abbastanza stabile la prioritร solitamente diviene quella di migliorare lโinterazione della stessa con lโutente (si parla di userโs experience).
Tali applicazioni che migliorano lโinterazione con lโutente vengono denominate in gergo informatico RIA (Rich Internet Application). AJAX rappresenta proprio uno strumento attraverso cui progettare applicazioni RIA.
Il primo motivo che ha portato alla nascita di AJAX รจ stato quello di migliorare le fasi HTTP di GET/POST delle pagine web. Infatti sebbene lo standard HTTP รจ funzionale e ormai ben conosciuto dagli sviluppatori esso presenta delle limitazioni, la prima delle quali รจ che lโutente costretto ad aspettare per un certo periodo di tempo mentre le pagine si aggiornano. AJAX introduce meccanismi che evitano (o riducono) questa attesa.
Pensiamo a come funziona il protocollo HTTP: quando si effettua una richiesta il browser invia la stessa la server e non รจ possibile fare altro finchรจ questo processo non giunge a termine. In pratica dunque si invia la richiesta e si attende, mentre lโindicatore posto in basso nel browser mostra il livello di completamento dellโoperazione e solo quando il controllo torna al browser รจ possibile ricominciare ad utilizzare lโapplicazione.
Lโapplicazione รจ dunque inutilizzabile finchรจ la richiesta non ritorna e in molti casi la finestra del browser diventa completamente bianca. La soluzione proposta da AJAX รจ quella di introdurre qualcosa che gestisca la richiesta asincronamente in modo che il browser sia piรน reattivo nellโinterazione con lโutente non bloccando lโintera pagina ma solo la porzione necessaria.
Una delle novitร che AJAX ha apportato alla programmazione web รจ lโintroduzione di nuove librerie lato client per facilitare le chiamate asincrone al server. Altra novitร รจ lโintroduzione di nuovi componenti lato server per supportare queste nuove chiamate asincrone provenienti dai client.
La seguente immagine, tratta dal sito Microsoft, riassume concettualmente lโuniverso AJAX
A prima vista AJAX sembra introdurre una maggiore complessitร nelle modalitร di sviluppo delle applicazioni web ma in realtร questa tecnologia porta alcuni fondamentali vantaggi:
- Eliminazione dei tempi morti in attesa della risposta inviata al server tramite il protocollo HTTP
- Introduzione di elementi grafici solitamente presenti in applicazioni desktop e di finestre di tipo pop-up molto utili per lโinterazione con gli utenti
- Introduzione dellโaggiornamento parziale della pagine, solo nelle sezioni interessate
- Supporto esteso a tutti i browser piรน diffusi e non soltanto a Internet Explorer
- Introduzione del concetto di extender control, una nuova tipologia di controlli che aggiungono un nuovo aspetto e nuove funzionalitร ai canonici controlli lato client
- Miglioramento dei servizi di autenticazione, profili e personalizzazione
La maggior parte del supporto per AJAX fornito da ASP.NET consiste in un insieme di controlli lato server responsabili del rendering delle pagine web nel nuovo stile introdotto da questa nuova tecnologia. In generale il lavoro di un controllo lato server รจ quello di produrre un output che collochi gli elementi HTML in modo che essi compaiano correttamente nel browser e i controlli stile AJAX si comportano allo stesso modo.
I controlli di tipo AJAX piรน frequentemente utilizzati sono:
- ScriptManager โ Gestisce gli script della pagina. La sua prima azione รจ quella di registrare la AJAX Library con la pagina in modo che gli script lato client possano utilizzarne le relative estensioni. Questo controllo consente inoltre il rendering parziale delle pagine.
- ScriptManagerProxy โ Gli script su una pagina web spesso richiedono una gestione speciale sul modo in cui il server li deve eseguire. Tipicamente viene utilizzato un controllo ScriptManager per organizzare gli script a livello di pagina mentre altri componenti nidificati (come i controlli utente) richiedono il controllo ScriptManagerProxy per gestire pagine e servizi dotati giร di un controllo ScriptManager. Un esempio di questa situazione sono le master page che tipicamente contengono un controllo ScriptManager. ASP.NET genera unโeccezione se se una seconda istanza di tale controllo viene individuata in una data pagina e pertanto le pagine di contenuti che utilizzano quelle determinate master page devono utilizzare obbligatoriamente il controllo ScriptManagerProxy.
- UpdatePanel โ Questo controllo consente lโaggiornamento parziale delle pagine.
- UpdateProgress โ Mostra le informazioni di stato sugli aggiornamenti parziali delle pagine che avvengono tramite il controllo UpdatePanel.
- Timer โ Questo controllo genera dei postback ad intervalli predefiniti. Esso viene utilizzato in particolare in stretta relazione con il controllo UpdatePanel per effettuare aggiornamenti parziali periodici di determinate sezioni delle pagine.
Il supporto lato client di AJAX si incentra invece su un insieme di librerie JavaScript che includono i seguenti livelli:
- Livello di compatibilitร dei browser che assicura la compatibilitร delle funzioni AJAX sui browser piรน diffusi;
- Nucleo di servizi che estendono il tradizionale ambiente JavaScript introducendo classi, namespace, gestori di eventi, tipi di dati e serializzazione di oggetti;
- Libreria base di classi lato client che include diversi componenti, come quello per la gestione delle stringhe e per quello per lโestensione della gestione degli errori;
- Livello di rete che gestisce la comunicazione tra i servizi web e e le applicazioni. Tale livello si occupa pure della gestione delle chiamate asincrone;
Molto utile รจ lโASP.NET Control Toolkit che consiste in una collezione di componenti (e di esempi che mostrano come utilizzare gli stessi) che consentono lโutilizzo delle funzioni AJAX. Questo Toolkit fornisce inoltre un kit di sviluppo software per creare controlli personalizzati ed รจ scaricabile dal sito web ufficiale ASP.NET AJAX. Esso non รจ incluso in Visual Studio 2010 e deve essere scaricato separatamente. Per tutti i dettagli potete consultare a questa pagina.
Eโ possibile scaricare i file binari o il codice sorgente. Se non vi interessa il codice sorgente per utilizzare questo componente รจ sufficiente aggiungere un riferimento allโassembly AjaxControlToolkit.dll ai vostri progetti.
Oltre ad AJAX negli ultimi anni sono stati introdotte varie altre utili tecnologie come Silverlight, WPF, WCF, che non saranno trattate nella presente guida poichรจ sono state giร presentate con alcuni articoli specifici che potete trovare nella sezione articoli ASP.NET del nostro sito.
Utilizzo di AJAX
Dopo aver introdotto AJAX vediamo un esempio volto a fare intuire le potenzialitร di questa innovativa tecnologia. Creeremo una semplice applicazione con una pagina di contenuto in cui inseriremo un UpdatePanel. Inseriremo poi nell apagina due label che mostreranno la data e lโora in cui la pagina viene caricata ma porremo una label allโinterno dellโ UpdatePanel e lโaltra allโesterno in modo da vedere come funziona lโaggiornamento parziale della pagina.
Creiamo dunque un nuovo sito web e aggiungiamo al form Default.aspx un controllo ScriptManager (posto nella tab AJAX Extensions del Toolbox), necessario per la gestione dei controlli AJAX inseriti nel form. Convenzionalmente tale controllo viene posto al di fuori del tag DIV che Visual Studio crea automaticamente. Dopo lโinserimento di questo controllo nella nostra pagina dovremmo avere una situazione simile alla seguente
Inseriamo ora una label nel nostro form e denominiamola LabelDataOraLoad. Inseriamo anche un button
Apriamo il file default.aspx.cs e modifichiamo Lโebento Page_Load in modo che la label visualizzi la data e lโora correnti
protected void Page_Load(object sender, EventArgs e)
{
this.LabelDataOraLoad.Text = DateTime.Now.ToString();
}
Avviamo lโapplicazione e generiamo alcuni postback, cliccando piรน volte sul button. Quello che osserviamo รจ che i valori riportati cambiano ad ogni pressione del button.
A questo punto aggiungiamo un controllo UpdatePanel alla pagina e poniamo una seconda label denominata LabelDataOraUpdate allโinterno di tale controllo
Anche per questa label modifichiamo lโevento Page_Load in modo che essa visualizzi la data e lโora correnti
protected void Page_Load(object sender, EventArgs e)
{
this.LabelDataOraLoad.Text = DateTime.Now.ToString();
this.LabelDataOraUpdate.Text = DateTime.Now.ToString();
}
Avviamo lโapplicazione e generiamo alcuni postback come in precedenza. Vediamo che le label si comportano alla stessa maniera, aggiornandosi ad ogni click
Questo perchรจ sebbene la seconda label sia allโinterno dellโUpdatePanel lโazione che causa i postback avviene al di fuori di questo controllo. A questo punto eliminiamo spostiamo il Button allโinterno dellโUpdatePanel. Se guardiamo il file default.aspx vediamo che il button viene posto allโinterno dei tag relativi al panel
Se a questo punto avviamo lโapplicazione vediamo che cliccando sul Button soltanto la label contenuta nellโUpdatePanel viene aggiornata mentre lโaltra rimane impostata sul valore relativo al primo caricamento della pagina
Questo รจ proprio il processo denominato aggiornamento parziale della paginaperchรจ soltanto una arte della pagina viene aggiornata in risposta ad una determinata azione (il click del Button).
Questo chiaramente รจ solo un piccolo esempio che mostra le potenzialitร di AJAX e vi invito ad approfondire tramite la documentazione ufficiale Microsoft le interessanti funzionalitร di altri controlli come Timer, UpdateProgress, AutoCompleteExtender, ecc.
Distribuzione di applicazioni ASP.NET
Nel momento in cui mettiamo in pratica le nostre conoscenze di ASP.NET e sviluppiamo unโapplicazione web il passo successivo รจ quello relativo alla distribuzione (in inglese deploy) della stessa. Fortunatamente ancora una volta anche per questo scopo ci viene in aiuto Visual Studio.
Come abbiamo accennato allโinizio della guida esistono diversi modelli di siti web che รจ possibile utilizzare per sviluppare e distribuire le nostre applicazioni su varie piattaforme
- HTTP โ Per questo tipo di siti Visual Studio crea una directory virtuale sotto IIS e utilizza IIS per intercettare le richieste effettuate in fase di sviluppo. In questo modello il file relativo alla soluzione (di estensione .sln) risiede in una directory specificata nelle impostazioni del progetto in Visual Studio. Il codice sorgente viene viene invece memorizzato nella directory virtuale di IIS (โฆInetpubwwwroot). Sebbene questo non sia il modello di sviluppo piรน indicato per molte organizzazioni, in alcuni casi (come lo sviluppo di siti da parte di singoli programmatori) esso puรฒ essere indicato.
- FTP โ Lโopzione per la creazione si siti web FTP รจ stata introdotta nella versione 2005 di Visual Studio per quei progetti che si desidera gestire da remoto tramite un server FTP. Per esempio questa opzione รจ consigliabile se si utilizza un servizio di hosting remoto per il proprio sito web. In questo modo si dispone di un semplice meccanismo per trasferire file dallโambiente di sviluppo allโambiente che ospita il sito. Per questo tipo di sito Visul Studio puรฒ connettersi ad un server FTP sul quale occorre disporre dei privilegi di lettura e scrittura sulla directory interessata. Se si dispone di tali permessi tramite Visual Studio รจ possibile gestire i contenuti del server FTP.
- File System โ Questa opzione รจ quella piรน orientata alle esigenze degli sviluppatori. Utilizzando tale modello si sfrutta il server web integrato in Visual Studio stesso per eseguire e testare lโapplicazione ed รจ possibile collocare la relativa directory in qualsiasi locazione del file system locale o anche su una cartella condivisa di un altro computer. Questo modello rappresenta una scelta obbligata se non si dispone dellโaccesso a IIS o non si dispone dei privilegi amministrativi sul sistema su cui si sta sviluppando lโapplicazione. In questo modo il sito gira localmente sul sistema ma in modo indipendente da IIS ed รจ possibile sviluppare e testare il sito sul file system. Successivamente quando il sito รจ pronto basta creare una directory virtuale su IIS e puntare la stessa sulla locazione del file system in cui si trova il sito.
Per molti programmatori la distribuzione di unโapplicazione รจ qualcosa a cui pensare alla fine del processo di sviluppo ed รจ unโattivitร completamente separata dalle altre. Invece la distribuzione di unโapplicazione web รจ unโattivitร da tenere in considerazione fin dallโinizio del processo di sviluppo poichรจ, specialmente dopo lโavvento del cloud computing, si potrebbe non disporre dellโaccesso ai server sui quali lโapplicazione stessa dovrร girare.
Per tale motivo Visual Studio include diverse nuove caratteristiche che rendono la distribuzione di unโapplicazione unโoperazione molto piรน gestibile rispetto al passato.
Tra queste nuove caratteristiche vi sono:
- Web packaging
- Gestione dei file web.config per la distribuzione
- Distribuzione database
- Modalitร di pubblicazione One-Click
Nelle versioni precedenti dellโambiente di sviluppo che non includevano tali caratteristiche solitamente si creava un pacchetto di installazione per la distribuzione delle applicazioni web. Sebbene creare un pacchetto di questo tipo sia preferibile alla semplice copia di file su un server web, il meccanismo dei pacchetti di installazione non poteva tenere conto di alcune cose come per esempio il fatto che lo schema di un database potrebbe cambiare in una delle distribuzioni di unโapplicazione successive alla prima.
La nuova caratteristica web packaging permette proprio di aggirare tali problemi. Tramite tale strumento รจ possibile creare un file compresso o una cartella contenente tutto il necessario per la distribuzione del progetto su un server web.
Un web package include:
- Contenuti (web form, controlli, file HTML, ecc.)
- Database, schemi e dati di SQL Server (se lโapplicazione li prevede)
- Impostazioni relative ad IIS
- Altri elementi necessari a supporto del progetto (componenti da installare nella global assembly cache, certificati di sicurezza, informazioni sulle impostazioni di voci di registro, ecc.)
Una volta creato un web package รจ possibile copiarlo su un server ed installarlo manualmente (utilizzando lโIIS Manager) o installarlo utilizzando opportuni comandi. In ogni caso come al solito il modo migliore per comprendere il tutto รจ quello di procedere con un esempio. Pertanto creiamo una nuova applicazione web
e denominiamola WebApplicationDeploy.
Viene creata la canonica applicazione di partenza ASP.NET che contiene, tra le altre cose, il web form Default.aspx
Supponendo che la nostra applicazione sia completa clicchiamo con il tasto destro del mouse sulla soluzione e scegliamo lโopzione Package/Publish Settings
Togliamo il segno di spunta sullโopzione Create deployment package as zip file (perchรจ vogliamo che i file vengano posti in una directory e non in un file compresso) e salviamo
Clicchiamo di nuovo con il tasto destro del mouse sulla soluzione e scegliamo lโopzione Build Deployment Package
In questo modo viene creata nella directory del progetto (sotto objDebugPackagePackageTemp) tutto il necessario per la distribuzione dellโapplicazione
A questo punto basta copiare tutti questi elementi in una directory da utilizzare come directory virtuale del nostro sito ed impostare IIS come abbiamo visto allโinizio della guida per permettere lโaccesso al sito da parte degli utenti.