Upload
annunciata-salvatore
View
221
Download
3
Tags:
Embed Size (px)
Citation preview
Applicazioni Web con Applicazioni Web con ASP.NETASP.NET
Silvano Coriani Silvano Coriani ([email protected])([email protected])
Academic Developer EvangelistAcademic Developer EvangelistDeveloper & Platform EvangelismDeveloper & Platform EvangelismMicrosoftMicrosoft
MMicrosoft icrosoft CCertified ertified TTrainerrainer
MMicrosoft icrosoft CCertified ertified SSolution olution DDevelopereveloper
MMicrosoft icrosoft CCertified ertified AApplication pplication DDevelopereveloper
MMicrosoft icrosoft CCertified ertified SSystem ystem EEngineer + ngineer + IInternetnternet
MMicrosoft icrosoft CCertified ertified DDataataBBase ase AAdministratordministrator
AgendaAgenda• RecallRecall
• HTMLHTML• Applicazioni Web dinamicheApplicazioni Web dinamiche
• Architettura di ASP.NETArchitettura di ASP.NET• Web Form (Web Control)Web Form (Web Control)• La libreria System.Web.UILa libreria System.Web.UI• Code-BehindCode-Behind• Data BindingData Binding• ASP.NET SecurityASP.NET Security
ProtocolliProtocolli• TCP/IPTCP/IP
• Protocollo utilizzato per tutte le Protocollo utilizzato per tutte le comunicazioni su Internetcomunicazioni su Internet
• Protocollo a due livelli: TCP e IP Protocollo a due livelli: TCP e IP
• Hypertext Transfer Protocol (HTTP)Hypertext Transfer Protocol (HTTP)• Protocollo per lo scambio di fileProtocollo per lo scambio di file• Utilizzato dai browser per accedere alle Utilizzato dai browser per accedere alle
risorserisorse• Si basa su TCP/IPSi basa su TCP/IP• E’ StatelessE’ Stateless
ClientClient ServerServer
Richiesta HTTPRichiesta HTTP
default.htmdefault.htm
IIS/ApacheIIS/Apache
Risposta HTTPRisposta HTTP
Request/Response HttpRequest/Response Http
Markup LanguageMarkup Language• Hypertext Markup Language (HTML)Hypertext Markup Language (HTML)
• Creazione di pagine WebCreazione di pagine Web• Si basa su tag che il browser interpreta per Si basa su tag che il browser interpreta per
visualizzare il contenutovisualizzare il contenuto
• Dynamic HTMLDynamic HTML• Client-sideClient-side• Consente di manipolare la pagina sul clientConsente di manipolare la pagina sul client
• Extensible Markup Language (XML)Extensible Markup Language (XML)• Definizione entità genericheDefinizione entità generiche• Utilizzato per lo scambio di datiUtilizzato per lo scambio di dati
Web Browser DiversiWeb Browser Diversi
Browser
Internet Explorer 5.x 6.x
Internet Explorer 4.x
ActiveX Controls
DHTML
Netscape Navigator 4.x
Netscape Navigator 3.x
Microsoft WebTV
VBScript JavaScript Java Applets
CSS 2.0
XML
Tag HTMLTag HTML<p>Ciao Ciao</p><p>Ciao Ciao</p>
<br><br>
<font color=red>Testo</font><font color=red>Testo</font>
• Contenuti in un file di testoContenuti in un file di testo• Memorizzati su un Server Memorizzati su un Server • Richiesti via Http dal browserRichiesti via Http dal browser• Interpretati sul clientInterpretati sul client
ClientClient ServerServer
Richiesta HTTPRichiesta HTTP
ASPASPengineengine
default.aspdefault.asp
IISIIS
JScriptJScriptVB ScriptVB ScriptEsecuzioneEsecuzione
ADOADO
Recupero risultatiRecupero risultati
Risposta HTTPRisposta HTTP
http://www.dcc.com/equipment/catalog_type.asp? http://www.dcc.com/equipment/catalog_type.asp? ProductType=rock+shoesProductType=rock+shoes
ASP.NET: flusso dell’applicazioneASP.NET: flusso dell’applicazione
Response ObjectResponse Object• Consente di gestire la risposta Http Consente di gestire la risposta Http
<% Response.Write(“Ciao”)%><% Response.Write(“Ciao”)%>
Invio dati dal browser al serverInvio dati dal browser al server<FORM action=“NomePagina” method=“XXX”><FORM action=“NomePagina” method=“XXX”>
<INPUT TYPE=“Text” NAME=“txtNome”><INPUT TYPE=“Text” NAME=“txtNome”>
<INPUT TYPE=“Text” NAME=“txtCognome”><INPUT TYPE=“Text” NAME=“txtCognome”>
<INPUT TYPE=“Submit”><INPUT TYPE=“Submit”>
</FORM></FORM>
• Le informazioni vengono inviate a Le informazioni vengono inviate a “NomePagina” sotto forma di stringhe“NomePagina” sotto forma di stringhe• GETGET
• txtNome=xxxx&txtCognome=yyyytxtNome=xxxx&txtCognome=yyyy• POSTPOST
• Come header HTTPCome header HTTP
• GET o POST?GET o POST?
Request ObjectRequest Object
• Contiene le info del QueryStringContiene le info del QueryString
<% nome=Request.QueryString("txtNome")%> <% nome=Request.QueryString("txtNome")%>
<% nome=Request.QueryString(“txtNome”) cognome =Request.QueryString(“txtCognome”) Response.Write(“Ciao” & nome & cognome)%>
<% nome=Request.QueryString(“txtNome”) cognome =Request.QueryString(“txtCognome”) Response.Write(“Ciao” & nome & cognome)%>
Request ObjectRequest Object
• Contiene le info del FormContiene le info del Form
<% nome=Request.Form("txtNome")%> <% nome=Request.Form("txtNome")%>
<% nome=Request.Form(“txtNome”) cognome =Request.Form(“txtCognome”) Response.Write(“Ciao” & nome & cognome)%>
<% nome=Request.Form(“txtNome”) cognome =Request.Form(“txtCognome”) Response.Write(“Ciao” & nome & cognome)%>
StatelessStateless• Ogni richiesta è a se stanteOgni richiesta è a se stante• Non esistono informazioni di stato in Non esistono informazioni di stato in
HTTPHTTP• Per ogni richiesta dobbiamo Per ogni richiesta dobbiamo
preoccuparci di inviare il contenutopreoccuparci di inviare il contenuto• Ad esempio riempire i campi di un form Ad esempio riempire i campi di un form
con le informazioni digitate dall’utentecon le informazioni digitate dall’utente• Es. ripresentare le informazioni digitateEs. ripresentare le informazioni digitate<INPUT <INPUT
TYPE=“TEXT” TYPE=“TEXT”
NAME=“txtNome” NAME=“txtNome” VALUE=<VALUE=<%=Request.QueryString(“txtNome”)%>%=Request.QueryString(“txtNome”)%>
>>
ASP 3.0: the goodASP 3.0: the good
• Modello di programmazione sempliceModello di programmazione semplice• Utilizzo di normali editor HTMLUtilizzo di normali editor HTML• Possibilità di modificare i sorgenti in Possibilità di modificare i sorgenti in
ogni momentoogni momento• Produzione di qualunque contenuto in Produzione di qualunque contenuto in
rispostarisposta• Nessuna forzatura per lo sviluppatoreNessuna forzatura per lo sviluppatore
• Utilizzo di nuove tecnolgie HTML 4 / CSSUtilizzo di nuove tecnolgie HTML 4 / CSS• Apertura verso altre tecnologie XML / XSLTApertura verso altre tecnologie XML / XSLT
ASP 3.0: The badASP 3.0: The bad• Solo codice scriptSolo codice script
• Povertà di linguaggioPovertà di linguaggio• Utilizzo limitato di librerieUtilizzo limitato di librerie• Lentezza in esecuzione (relativa)Lentezza in esecuzione (relativa)
• Sorgenti non protetti dall’infrastrutturaSorgenti non protetti dall’infrastruttura• Overlap fra codice e HTMLOverlap fra codice e HTML• Debug e gestione erroriDebug e gestione errori• Non abbiamo oggetti, solo stringheNon abbiamo oggetti, solo stringhe• Scrivere codice per qualsiasi cosaScrivere codice per qualsiasi cosa
• Mantenere lo stato dei campiMantenere lo stato dei campi• Validazione client e server differentiValidazione client e server differenti• Output differente IE / NS / DeviceOutput differente IE / NS / Device
• Nessuna interazione con il SONessuna interazione con il SO• IIS/W2K per settaggi applicativiIIS/W2K per settaggi applicativi
SoluzioneSoluzione• ASP.NETASP.NET
• Linguaggio potente (VB, C#)Linguaggio potente (VB, C#)• CompilazioneCompilazione
• AutomaticaAutomatica• E modifiche del codice sempre ammesseE modifiche del codice sempre ammesse
• Web Form e ControlliWeb Form e Controlli• Proprietà, Metodi, EventiProprietà, Metodi, Eventi
• Le pagine sono classiLe pagine sono classi• Debug e gestione errori completaDebug e gestione errori completa• Web.config per settaggi applicativiWeb.config per settaggi applicativi• Web Service integratiWeb Service integrati• Separazione fra codice e HTML (Code Behind)Separazione fra codice e HTML (Code Behind)
ASP.NET FrameworkASP.NET Framework
• Piattaforma nella piattaformaPiattaforma nella piattaforma• Facilita la costruzione di applicazioni Facilita la costruzione di applicazioni
server-sideserver-side• Basate su HTTP, HTML, XML e SOAPBasate su HTTP, HTML, XML e SOAP• Processa richiesta HTTPProcessa richiesta HTTP• E fornisce risposte HTTPE fornisce risposte HTTP• Il web è sempre lo stessoIl web è sempre lo stesso
ASP.NET Page FrameworkASP.NET Page Framework
ASP.NETASP.NET
Web FormsWeb Forms XML Web ServicesXML Web Services
WindowsWindows COM + ServicesCOM + Services
Visu
al Stu
dio
.NE
TV
isual S
tud
io .N
ET
Common Language Runtime (CLR)Common Language Runtime (CLR)
.NET Framework classes.NET Framework classes
ADO.NET e XMLADO.NET e XML
WindowsWindowsFormsForms
Common language specification (CLS)Common language specification (CLS)
C#C# J#J# J#J#VB.NETVB.NET
ASP.NET Web FormASP.NET Web Form
<FORM action=“NomeRisorsa” <FORM action=“NomeRisorsa” METHOD=“POST”>METHOD=“POST”><INPUT TYPE=“Text” ID=“txtNome” <INPUT TYPE=“Text” ID=“txtNome”
runat=“server”>runat=“server”>
<INPUT TYPE=“Text” ID=“txtCognome”<INPUT TYPE=“Text” ID=“txtCognome”
runat=“server”>runat=“server”>
<INPUT TYPE=“Submit”><INPUT TYPE=“Submit”>
</FORM></FORM>
• I controlli mantengono lo statoI controlli mantengono lo stato
Dynamic CompilationDynamic Compilation
ASPXASPXFileFile
RequestRequest
ASPXASPX
EngineEngine
ParsingParsing
ClassFilesu
Disco
GenerazioneGenerazione
PagePage
ClassClass Istanza, Istanza, Esecuzione Esecuzione e Renderinge Rendering
ResponseResponse
RequestRequest
CreazioneCreazioneIstanzaIstanza
ResponseResponse
Code-Code-behindbehind
filefile
ASP.NET Internals (IIS 5 – Win 2000)ASP.NET Internals (IIS 5 – Win 2000)
INETINFO.exeINETINFO.exe
ISAPI ISAPI Extension Extension ManagerManager
ASPNET_WP.EXEASPNET_WP.EXEWorker ProcessWorker Process
HTTP RequestHTTP Request.ASPX.ASPX
.ASMX.ASMX
.ASHX.ASHX
.DISCO.DISCO
.SOAP.SOAP
ASP.DLLASP.DLL ASP.NET ASP.NET PipelinePipeline
INETINFO.exeINETINFO.exe
ISAPI ISAPI Extension Extension ManagerManager
ASPNET_ISAPI.DLLASPNET_ISAPI.DLL
•ASP.NET non usa ISAPI/ASPASP.NET non usa ISAPI/ASP
•ISAPI extension redirige le richieste ISAPI extension redirige le richieste sul sul worker processworker process
NamedNamedPipePipe
ASP.NET Internals (IIS 6 – Win ASP.NET Internals (IIS 6 – Win 2003)2003)
WWW ServiceWWW
Service
Con
fig M
grC
onfig
Mgr
Proc
ess
Mgr
Proc
ess
Mgr
HTTP.sysHTTP.sys
Web GardenWeb Garden
W3WP.exeW3WP.exe
ISAPIExtensions(ASP, etc.)
ISAPIExtensions(ASP, etc.)
ISAPI FiltersISAPI Filters
Application Pool 2
Application Pool 2
W3WP.exeW3WP.exe
ASP.NET ISAPIASP.NET ISAPI
CLR Application Domain
CLR Application Domain
W3WP.exeW3WP.exe
ASP.NET ISAPIASP.NET ISAPI
CLR Application Domain
CLR Application Domain
Application Pool 1
Application Pool 1
metabase
INETINFO
ASP.NET InternalsASP.NET Internals• Le richieste sono processate nella pipeline Le richieste sono processate nella pipeline
all’interno del worker threadall’interno del worker thread• La pipeline contiene classi HttpRuntimeLa pipeline contiene classi HttpRuntime• I moduli sono interceptor opzionaliI moduli sono interceptor opzionali• HttpContext è la classe accessibile nella HttpContext è la classe accessibile nella
pipelinepipeline
ASPNET_WP.EXEASPNET_WP.EXE
HttpRuntimeHttpRuntimeClassClass Modulo 1Modulo 1 Modulo 2Modulo 2 HTTP HandlerHTTP Handler
Pagina1.aspxPagina1.aspx
HttpRuntimeHttpRuntimeClassClass Modulo 1Modulo 1 Modulo 2Modulo 2 HTTP HandlerHTTP Handler
Pagina2.aspxPagina2.aspx
ASP.NET worker thread 1ASP.NET worker thread 1
ASP.NET worker thread 2ASP.NET worker thread 2
HttpContext PropertyHttpContext PropertyTYPETYPE NameName DescrizioneDescrizioneHttpContextHttpContext CurrentCurrent Contesto correnteContesto corrente
HttpRequestHttpRequest RequestRequest Richiesta HttpRichiesta Http
HttpResponseHttpResponse ResponseResponse Risposta HttpRisposta Http
HttpServerUtilityHttpServerUtility ServerServer URL CrackingURL Cracking
HttpSessionStateHttpSessionState SessionSession Sessione per clientSessione per client
HttpApplicationStateHttpApplicationState ApplicationApplication Property Bag applicativaProperty Bag applicativa
HttpApplicationHttpApplication ApplicationInstancApplicationInstancee
Contesto ApplicativoContesto Applicativo
IHttpHandlerIHttpHandler HandlerHandler Handler della chiamataHandler della chiamata
IDictionaryIDictionary ItemsItems Property Bag per richiestaProperty Bag per richiesta
ExceptionException ErrorError Primo errore incontratoPrimo errore incontrato
IPrincipalIPrincipal UserUser Security ID del chiamanteSecurity ID del chiamante
Compilazione automaticaCompilazione automatica
• Supporto per la compilazione del Supporto per la compilazione del sorgente just-in-timesorgente just-in-time
• Auto compilazione per .aspx .ascx .asmx Auto compilazione per .aspx .ascx .asmx .ashx.ashx
• L’assembly generato viene memorizzato L’assembly generato viene memorizzato in una directory dietro le quintein una directory dietro le quinte
• Reference automatica agli assembly Reference automatica agli assembly comunicomuni
• Gli altri assembly sono referenziabili Gli altri assembly sono referenziabili con direttive nella paginacon direttive nella pagina
• Shadow-copying per DLL Shadow-copying per DLL (sovrascrivibili)(sovrascrivibili)
System.Web.UI.PageSystem.Web.UI.Page
• Classe da cui vengono ereditati i Classe da cui vengono ereditati i file .aspxfile .aspx
• Si possono costruire variabili membroSi possono costruire variabili membro• HTML diventa parte del metodo RenderHTML diventa parte del metodo Render• Il codice di rendering diventa parte del Il codice di rendering diventa parte del
metodo Rendermetodo Render• WebForm e Controlli Server-side sono WebForm e Controlli Server-side sono
costruiti sulla classe Pagecostruiti sulla classe Page
DirettiveDirettive
• A livello di paginaA livello di pagina• @Page controlla la compilazione@Page controlla la compilazione
• Molti attributiMolti attributi
• @Assembly per referenziare un @Assembly per referenziare un assembly esternoassembly esterno• Come /r nei compilatori VBC.exe e CSC.exeCome /r nei compilatori VBC.exe e CSC.exe
• @Import per importare un namespace@Import per importare un namespace• Imports di VB.NETImports di VB.NET• using di C#; using di C#;
<%@Page Language=“VB” <%@Page Language=“VB” Explicit=“True” %>Explicit=“True” %>
<%@Assembly name=“GestioneCorsi” %><%@Assembly name=“GestioneCorsi” %>
<%@Import namespace=“Corsi” %><%@Import namespace=“Corsi” %>
---codice------codice---
Referenzia l’AssemblyReferenzia l’AssemblyGestioneCorsi.dllGestioneCorsi.dll
Codice VB (uno solo per Codice VB (uno solo per pagina)pagina)
Dichiarazione variabili Dichiarazione variabili obbligatoria (abilitare obbligatoria (abilitare sempre)sempre)
Queste direttive corrispondono aQueste direttive corrispondono a
Vbc.exe /optionexplicit+ /r:GestioneCorsi.dll ElencoCorsi_aspxVbc.exe /optionexplicit+ /r:GestioneCorsi.dll ElencoCorsi_aspx
Direttive per @PageDirettive per @PageLanguageLanguage Linguaggio utilizzatoLinguaggio utilizzato
BufferBuffer Response Buffering True/FalseResponse Buffering True/False
ContentTypeContentType Header Content Type MIMEHeader Content Type MIME
EnableSessionStateEnableSessionState Session True/FalseSession True/False
EnableViewStateEnableViewState ViewState True/FalseViewState True/False
SrcSrc File sorgente per code-behindFile sorgente per code-behind
InheritsInherits Base Class diverse da PageBase Class diverse da Page
ErrorPageErrorPage URL per eccezioni non gestiteURL per eccezioni non gestite
ExplicitExplicit Option Explicit True/FalseOption Explicit True/False
StrictStrict Option Strict True/FalseOption Strict True/False
DebugDebug Compilazione con simboli True/FalseCompilazione con simboli True/False
TraceTrace Tracing True/FalseTracing True/False
CompilerOptionsCompilerOptions Switch per VBC.exe o CSC.exeSwitch per VBC.exe o CSC.exe
Code BehindCode Behind
• Code behindCode behind• File separato per il codiceFile separato per il codice• Compilazione automaticaCompilazione automatica
• @Page @Page Src=“Codice.vb/cs” Src=“Codice.vb/cs” Inhrerits=“Classe”Inhrerits=“Classe”
• Nel file Codice.vbNel file Codice.vb• Public class ClassePublic class Classe
• Inherits System.Web.UI.PageInherits System.Web.UI.Page• Poi il codice da usare con la paginaPoi il codice da usare con la pagina• EventiEventi• FunzioniFunzioni
• Visual Studio .aspx.vb | .aspx.csVisual Studio .aspx.vb | .aspx.cs
EreditarietàEreditarietà
• Il Code Behind non è un’appendice della Il Code Behind non è un’appendice della pagina ma la classe da cui viene pagina ma la classe da cui viene ereditata la paginaereditata la pagina
ScheminoSchemino
System.Web.UI.PageSystem.Web.UI.Page
Public Class CodicePublic Class CodiceInherits S.W.U.PageInherits S.W.U.Page
@Page Inherits=“Codice”@Page Inherits=“Codice”
.dll.dll
.VB.VB
.aspx.aspx
public Event EventHandler Loadpublic Event EventHandler Load
public bool IsPostBack {get;}public bool IsPostBack {get;}
public HttpRequest {get;}public HttpRequest {get;}
public HttpResponse {get;}public HttpResponse {get;}
Public txtName as S.W.U.TextBoxPublic txtName as S.W.U.TextBox
Sub Page_Load(x,y)Sub Page_Load(x,y)
Response.Write “x”Response.Write “x”
End SubEnd Sub
La classe contiene le interfacce La classe contiene le interfacce della classe base + txtNamedella classe base + txtName
<asp:TextBox Id=“txtName” /><asp:TextBox Id=“txtName” />
La pagina eredita la Classe CodiceLa pagina eredita la Classe CodiceQuindi le nuove proprietà, eventiQuindi le nuove proprietà, eventie metodi rispetto a Pagee metodi rispetto a Page
Ancora Code BehindAncora Code Behind
• Con l’attributo Src il Code Behind viene Con l’attributo Src il Code Behind viene compilato a run-timecompilato a run-time
• Si può pre-compilare il .vb|.cs Si può pre-compilare il .vb|.cs • Copiarlo nella directory binCopiarlo nella directory bin
• In produzione precompilareIn produzione precompilare
Server ControlsServer Controls• Oggetti programmabiliOggetti programmabili• Attributo runat=“server”Attributo runat=“server”• Mantengono lo stato delle infoMantengono lo stato delle info• Generano HTML per il clientGenerano HTML per il client• Scatenano eventiScatenano eventi• Espongono Espongono
• ProprietàProprietà• MetodiMetodi
Server ControlsServer Controls• HTML ControlHTML Control
• Sintassi HTMLSintassi HTML• Mappati 1:1 con controlli HTMLMappati 1:1 con controlli HTML• Namespace System.Web.UI.HtmlControlsNamespace System.Web.UI.HtmlControls
• Web ControlsWeb Controls• Sintassi diversaSintassi diversa• Tutti gli HTML ControlTutti gli HTML Control• E controlli avanzatiE controlli avanzati
HTML ControlHTML Control• <input type=“text” value=“default” <input type=“text” value=“default”
runat=“server” id=“txtName” >runat=“server” id=“txtName” >
• Mappano i tag HTML 1:1Mappano i tag HTML 1:1• Lavorano bene con gli Editor attualiLavorano bene con gli Editor attuali• Ma il modello ad oggetti non è strongly-Ma il modello ad oggetti non è strongly-
typedtyped• Ad esempioAd esempio
• txtName.Value = “Roberto”txtName.Value = “Roberto”• mama• txtName.SetAttribute("bgcolor", "red")txtName.SetAttribute("bgcolor", "red")
Web ControlWeb Control• <asp:TextBox runat=“server” id=“txtName” <asp:TextBox runat=“server” id=“txtName”
Text=“default”></asp:TextBox>Text=“default”></asp:TextBox>
• Modello ad oggetti consistente e strongly-Modello ad oggetti consistente e strongly-typed typed • txtName.Text = “Roberto”txtName.Text = “Roberto”• txtName.BackColor = Color.RedtxtName.BackColor = Color.Red
• Miglior supporto per VS.NET DesignerMiglior supporto per VS.NET Designer• Rendering differente per browserRendering differente per browser
• Esempio: LabelEsempio: Label
• Funzionalità differenti per browserFunzionalità differenti per browser• Esempio: Validation ControlEsempio: Validation Control
Alcuni esempiAlcuni esempi• <asp:textbox /><asp:textbox /> <input type=text><input type=text>• <asp:button /><asp:button /> <input type=submit><input type=submit>• <asp:imagebutton /><asp:imagebutton /> <input type=image><input type=image>• <asp:checkbox /><asp:checkbox /> <input type=checkbox><input type=checkbox>• <asp:radiobutton /><asp:radiobutton /> <input type=radiobutton><input type=radiobutton>• <asp:listbox /><asp:listbox /> <select size=“5”><select size=“5”>• <asp:dropdownlist /><asp:dropdownlist /> <select><select>• <asp:hyperlink /><asp:hyperlink /> <a href=“...”><a href=“...”>• <asp:image /><asp:image /> <img src=“...”><img src=“...”>• <asp:label /><asp:label /> <span><span>• <asp:panel /><asp:panel /> <div><div>• <asp:table /><asp:table /> <table><table>
Altri Web ControlAltri Web Control• List Control List Control
• Iterativi su una base di datiIterativi su una base di dati• DropDownList, ListBoxDropDownList, ListBox• RadioButtonList, CheckBoxListRadioButtonList, CheckBoxList• Repeater, DataList, DataGridRepeater, DataList, DataGrid
• Validation ControlValidation Control• Ci arriviamo fra poco…Ci arriviamo fra poco…
• Controlli complessi (Rich Control)Controlli complessi (Rich Control)• Calendar, AdRotator, XmlCalendar, AdRotator, Xml
• Mobile Control: per device e telefoniniMobile Control: per device e telefonini• Internet Explorer ControlInternet Explorer Control
DatiDati
• VariabiliVariabili• Proprietà di oggettiProprietà di oggetti
• N.B. Anche la pagina è un oggettoN.B. Anche la pagina è un oggetto
• Risultati di funzioni o metodiRisultati di funzioni o metodi• ArrayArray• DatabaseDatabase• XMLXML• WebWeb
Data BindingData Binding
• Aggancio fra un elemento visivo a un Aggancio fra un elemento visivo a un datodato• In modo dichiarativoIn modo dichiarativo• Molto sempliceMolto semplice• Molto veloceMolto veloce• Molti datasource supportatiMolti datasource supportati• Tecnologia aperta anche per DBTecnologia aperta anche per DB
• AutomatizzataAutomatizzata• Non come in VB (per fortuna)Non come in VB (per fortuna)
• Più semplice agganciare codice ottimizzato per Più semplice agganciare codice ottimizzato per insert/update/deleteinsert/update/delete
CodiceCodice
• Dichiarazione di binding sempliceDichiarazione di binding semplice• <%#strDato %><%#strDato %>• <asp:Label Text=<%#strDato %><asp:Label Text=<%#strDato %>• <asp:Label Text=<%#Funzione(par) %><asp:Label Text=<%#Funzione(par) %>• <asp:Label Text=<%#obj.Nome %><asp:Label Text=<%#obj.Nome %>• <asp:Label Text=<%#obj.Fai(par) %><asp:Label Text=<%#obj.Fai(par) %>
• Poi valutazione delle espressioniPoi valutazione delle espressioni• Page.DataBind()Page.DataBind()• Valuta tutte le espressioni di bindingValuta tutte le espressioni di binding
• Metodo DataBind() su tutti i controlliMetodo DataBind() su tutti i controlli• E valorizza i <%# %>E valorizza i <%# %>
Data Binding “multiplo”Data Binding “multiplo”
• Controlli che supportano la proprietà Controlli che supportano la proprietà DataSourceDataSource
• Possono essere agganciati a oggetti che Possono essere agganciati a oggetti che supportano IEnumerable o ICollectionsupportano IEnumerable o ICollection
• I controlli supportano il metodo I controlli supportano il metodo DataBind()DataBind()• Che valuta il loro DataSource e popola il Che valuta il loro DataSource e popola il
controllocontrollo• Invoca anche il metodo DataBind() di tutti i Invoca anche il metodo DataBind() di tutti i
controlli Childrencontrolli Children• Come per la PageCome per la Page
Controlli bindabiliControlli bindabiliHtmlSelectHtmlSelect
CheckBoxListCheckBoxList
RadioButtonLisRadioButtonListt
ComboBoxComboBox
DropDownListDropDownList
ListBoxListBox
DataGridDataGrid
DataListDataList
RepeaterRepeater
ArrayArray
ArrayListArrayList
HashTableHashTable
QueueQueue
SortedListSortedList
StackStack
StringCollectionStringCollection
DataViewDataView
DataTableDataTable
DataSetDataSet
SqlDataReaderSqlDataReader
OleDbDataReaderOleDbDataReader
BindabiliBindabili
DataTextField DataTextField Associa il Associa il
campo dacampo da
visualizzarevisualizzare
DataValueFieldDataValueField
Associa il campo da Associa il campo da
associareassociare
DataReaderDataReader
• Per fare estrazione e presentazione di Per fare estrazione e presentazione di datidati• Tipicamente usato nell’evento LoadTipicamente usato nell’evento Load• Chiamare DataBind() prima di chiudere la Chiamare DataBind() prima di chiudere la
connessioneconnessione• Si può sempre usareSi può sempre usare
• DataTextField DataTextField • Associa il campo da visualizzareAssocia il campo da visualizzare
• DataValueFieldDataValueField• Associa il campo da associareAssocia il campo da associare
DataViewDataView
• Rappresenta una vista su una DataTableRappresenta una vista su una DataTable• DefaultView su ogni DataTableDefaultView su ogni DataTable• Custom DataViewCustom DataView
• Per filtri e sort su una DataTablePer filtri e sort su una DataTable• Bindando una DataTable si binda in realtà la Bindando una DataTable si binda in realtà la
DefaultView sulla tabellaDefaultView sulla tabella• Bindando il DataSet si binda in realtà la Bindando il DataSet si binda in realtà la
DefaultView della prima tableDefaultView della prima table
DataGridDataGrid
• Fornisce una rappresentazione tabellare Fornisce una rappresentazione tabellare dei datidei dati
• Formata da colonne, header e footerFormata da colonne, header e footer• Colonne autogenerabiliColonne autogenerabili• O esplicitamente dichiarate con O esplicitamente dichiarate con
BoundColumnsBoundColumns• Visualizzazione personalizzabileVisualizzazione personalizzabile• Occhio al VIEWSTATEOcchio al VIEWSTATE
DataGrid con EditingDataGrid con Editing• EditCommandColumn visualizza link perEditCommandColumn visualizza link per
• EditCommand, UpdateCommand, CancelCommandEditCommand, UpdateCommand, CancelCommand
• OnEditCommand per gestire l’evento di editingOnEditCommand per gestire l’evento di editing• La DataGrid mantiene la proprietà EditItemIndexLa DataGrid mantiene la proprietà EditItemIndex
• Riga da editareRiga da editare• -1 se in modalità visualizzazione-1 se in modalità visualizzazione
• DataGridCommandEventArgs viene passato ai DataGridCommandEventArgs viene passato ai vari handlervari handler
• DataKeyField deve contenere la chiave primariaDataKeyField deve contenere la chiave primaria• Nell’handler UpdateCommand si usa Nell’handler UpdateCommand si usa
DataKeyField per accedere alla Primary Key da DataKeyField per accedere alla Primary Key da modificaremodificare
Templated ControlTemplated Control
• Forniscono un meccanisco per separare Forniscono un meccanisco per separare la visualizzazione di un controllo dalle la visualizzazione di un controllo dalle sue funzionalitàsue funzionalità
• Un templated control gestisce i dati e il Un templated control gestisce i dati e il layout ma usa un template da creare layout ma usa un template da creare per il rendering attuale dei datiper il rendering attuale dei dati
TemplateTemplate
• DataList, Repeater e DataGridDataList, Repeater e DataGrid• Consentono di utilizzare un template Consentono di utilizzare un template
per la visualizzazione dei datiper la visualizzazione dei dati• Forniscono l’involucro per visualizzare i Forniscono l’involucro per visualizzare i
datidati• Gestiscono il layout e il binding in Gestiscono il layout e il binding in
automaticoautomatico• Sfruttano il template fornitoSfruttano il template fornito• La riga “in binding” è accessibile La riga “in binding” è accessibile
tramite Container.DataItemtramite Container.DataItem
Templated Control e TemplateTemplated Control e Template
DataGridDataGridColumnsColumns
DataListDataListHeaderTemplateHeaderTemplateItemTemplateItemTemplateAlternatingItemTemplaAlternatingItemTemplateteSeparatorTemplateSeparatorTemplateSelectedItemTemplateSelectedItemTemplateEditItemTemplateEditItemTemplateFooterTemplateFooterTemplate
RepeaterRepeaterHeaderTemplateHeaderTemplateItemTemplateItemTemplateAlternatingItemTemplatAlternatingItemTemplateeSeparatorTemplateSeparatorTemplateFooterTemplateFooterTemplate
TemplateColumnTemplateColumn
HeaderTemplateHeaderTemplateItemTemplateItemTemplateEditItemTemplateEditItemTemplateFooterTemplateFooterTemplate
ItemTemplateItemTemplate Visualizzazione dell’elementoVisualizzazione dell’elementoAlternatingItemTemplateAlternatingItemTemplate Visualizzazione dell’elemento pariVisualizzazione dell’elemento pariSeparatorTemplateSeparatorTemplate Visualizzazione del separatore di rigaVisualizzazione del separatore di rigaSelectedItemTemplateSelectedItemTemplate Visualizzazione dell’elemento selezionatoVisualizzazione dell’elemento selezionatoEditItemTemplateEditItemTemplate Visualizzazione della colonna in EditingVisualizzazione della colonna in Editing
DataBinder vs ContainerDataBinder vs Container
• Container.DataItem Container.DataItem • Ritorna un Object generico Ritorna un Object generico • Occorre effettuare il castOccorre effettuare il cast
• DataBinder.EvalDataBinder.Eval• Usa ReflectionUsa Reflection• Per fare il parse e l’evaluatePer fare il parse e l’evaluate• Dell’espressione di bindingDell’espressione di binding• Evitando il castEvitando il cast
RepeaterRepeater
• Contenitore genericoContenitore generico• Itera sui datiItera sui dati• Eseguendo il rendering Eseguendo il rendering
dell’ItemTemplate per ogni elemento dell’ItemTemplate per ogni elemento della collezione DataSourcedella collezione DataSource
• Utile per avere controllo completo sul Utile per avere controllo completo sul rendering dei datirendering dei dati
DataListDataList
• Visualizza i dati in una listaVisualizza i dati in una lista• Utile per visualizzazioni a listaUtile per visualizzazioni a lista
• Il default è righe/colonneIl default è righe/colonne
• Simile alla DataGrid maSimile alla DataGrid ma• Più semplice da usarePiù semplice da usare• Più leggere e quindi velocePiù leggere e quindi veloce
• Richiede almeno un ItemTemplateRichiede almeno un ItemTemplate• Ogni template ha un suo stileOgni template ha un suo stile
• HeaderStyleHeaderStyle• ItemStyleItemStyle
ASP.NET XML Server ControlASP.NET XML Server Control• <asp:xml runat=server><asp:xml runat=server>
• Gestisce l’output di XMLGestisce l’output di XML• Trasformazione opzionale XSL/TTrasformazione opzionale XSL/T
• Bind verso file XML o DatabaseBind verso file XML o Database• Caching built-in per la trasformazioneCaching built-in per la trasformazione• EfficenteEfficente
EventiEventi
• Page EventsPage Events• La pagina è una classe quindi scatena eventiLa pagina è una classe quindi scatena eventi• Page_InitPage_Init• Page_LoadPage_Load• Page_UnloadPage_Unload• La routing di evento riceve gli La routing di evento riceve gli
argomenti .NETargomenti .NET
• Control EventsControl Events• Quasi sempre Change e ClickQuasi sempre Change e Click• SelectedIndexChange per ListBoxSelectedIndexChange per ListBox
Definizione EventoDefinizione Evento
• <input type=submit value=Premi<input type=submit value=Premirunat=server onServerClick=“Fai”>runat=server onServerClick=“Fai”>• onClick verrebbe inviato al clientonClick verrebbe inviato al client• In generale ogni attributo non utilizzato In generale ogni attributo non utilizzato
server-side o sconosciuto viene inviato al server-side o sconosciuto viene inviato al clientclient
• <asp:button value=Premi<asp:button value=Premi runat=server onClick=“Fai” /> runat=server onClick=“Fai” />
• Visual Studio invece Visual Studio invece • VB: AddHandler b1_Click, AddressOf btn1_ClickVB: AddHandler b1_Click, AddressOf btn1_Click• C#: b1.Click += new EventHandler(btn1_Click)C#: b1.Click += new EventHandler(btn1_Click)
Viene prima il click o change ?Viene prima il click o change ?
• Sequenza esattaSequenza esatta• Controlli_InitControlli_Init• Validazioni...vediamo fra pocoValidazioni...vediamo fra poco• Page_InitPage_Init• Page_LoadPage_Load• Controlli_LoadControlli_Load• _Changed_Changed
• Per tutti i controlli modificatiPer tutti i controlli modificati• In ordine randomIn ordine random
• _Click_Click• Page_UnloadPage_Unload• Render verso il browserRender verso il browser
GET o POSTGET o POST• If If
Request.ServerVariables(“HTTP_METHORequest.ServerVariables(“HTTP_METHOD”) diventaD”) diventa
• If Page.IsPostBackIf Page.IsPostBack• Proprieta della classe PageProprieta della classe Page• True se POSTTrue se POST• False se GETFalse se GET
Auto POSTAuto POST• Esempio per combo boxEsempio per combo box• <asp:dropdownlist id=“lstCorsi” runat=“server” <asp:dropdownlist id=“lstCorsi” runat=“server”
onSelectedIndexChanged=“lst_Change”>onSelectedIndexChanged=“lst_Change”>• Il Changed verrà processato al successivo postIl Changed verrà processato al successivo post
• <asp:dropdownlist id=“lstCorsi” <asp:dropdownlist id=“lstCorsi” runat=“server” runat=“server” autoPostBack=“True”autoPostBack=“True” onSelectedIndexChanged=“lst_Change”>onSelectedIndexChanged=“lst_Change”>• Viene eseguita immediatamente la post con Viene eseguita immediatamente la post con
codice Javascript clientcodice Javascript client• Non potrebbe essere altrimentiNon potrebbe essere altrimenti• Necessita di Browser scriptabileNecessita di Browser scriptabile
Global.asaxGlobal.asax• Architettura completamente rivistaArchitettura completamente rivista• Quindi qualche evento in piùQuindi qualche evento in più• Si intercettano sempre conSi intercettano sempre con
• Sub Application_qualcosaSub Application_qualcosa
• A cui vengono passati i soliti parametriA cui vengono passati i soliti parametri• (x as Object, e as EventArgs)(x as Object, e as EventArgs)
Web.ConfigWeb.Config
• File di configurazioneFile di configurazione• In formato XMLIn formato XML
• Occhio !!! È case sensitiveOcchio !!! È case sensitive
• Per impostare parametri applicativiPer impostare parametri applicativi• Opzioni di compilazioneOpzioni di compilazione• SicurezzaSicurezza• Gestione delle sessioniGestione delle sessioni• Moduli HTTP (HttpModule) customModuli HTTP (HttpModule) custom• Handler HTTPHandler HTTP
• Sovrascrive le impostazioni di defaultSovrascrive le impostazioni di default• X:\WINNT\Microsoft.NET\Framework\X:\WINNT\Microsoft.NET\Framework\
<versione>\CONFIG\Machine.Config<versione>\CONFIG\Machine.Config
Web.ConfigWeb.Config
• E valori customE valori custom• Connection StringConnection String• Informazioni statiche che prima si Informazioni statiche che prima si
mettevano in Application o su file esternimettevano in Application o su file esterni
• <appSettings><appSettings>• <add key=“cString” value=“.....” /><add key=“cString” value=“.....” />
• </appSettings></appSettings>
• Nel codiceNel codice• strConn = strConn =
Configuration.AppSettings(“DSN”)Configuration.AppSettings(“DSN”)
SessionSession• In ASP 1/2/3 le session In ASP 1/2/3 le session
• Necessitano del supporto dei cookie sul Necessitano del supporto dei cookie sul clientclient
• Sono single-machine e non adatte a Sono single-machine e non adatte a configurazione di load-balancingconfigurazione di load-balancing
• Consumano molta RAMConsumano molta RAM
• In ASP.NET le sessionIn ASP.NET le session• Possono lavorare come prima oppurePossono lavorare come prima oppure• Non necessitare dei cookieNon necessitare dei cookie• Essere multi-machineEssere multi-machine• Appoggiarsi su DB o su uno State ServerAppoggiarsi su DB o su uno State Server
SessionSession
<sessionState mode="InProc“ <sessionState mode="InProc“ timeout=“20”/>timeout=“20”/>
• L’oggetto Session viene appoggiato nella L’oggetto Session viene appoggiato nella memoria del WP di ASP.NETmemoria del WP di ASP.NET
• ProPro• VelocissimeVelocissime
• ControContro• Necessitano di cookie abilitati sul clientNecessitano di cookie abilitati sul client• Se crasha l’applicazione le session si perdonoSe crasha l’applicazione le session si perdono• Non si può fare load balancing veroNon si può fare load balancing vero
Session senza CookieSession senza Cookie
<sessionState mode="InProc“ <sessionState mode="InProc“ timeout=“20” timeout=“20” cookieless=“true"cookieless=“true" /> />
• L’oggetto Session viene appoggiato nella L’oggetto Session viene appoggiato nella memoria del WP di ASP.NETmemoria del WP di ASP.NET
• ProPro• VelocissimeVelocissime• Non necessitano di cookie abilitati sul clientNon necessitano di cookie abilitati sul client
• ControContro• Se crasha l’applicazione le session si perdonoSe crasha l’applicazione le session si perdono• Non si può fare load balancing veroNon si può fare load balancing vero
Session fuori dal WPSession fuori dal WP<sessionState mode=“StateServer“ <sessionState mode=“StateServer“
timeout=“20” timeout=“20” stateConnectionString="tcpip=127.0.0.1:42424 stateConnectionString="tcpip=127.0.0.1:42424 />/>
• L’oggetto Session viene appoggiato nella L’oggetto Session viene appoggiato nella memoria del servizio ASPStatememoria del servizio ASPState
• ProPro• Se crasha l’applicazione le session sono salveSe crasha l’applicazione le session sono salve• Si può fare load balancing vero con N IIS che si Si può fare load balancing vero con N IIS che si
appoggiano ad un solo ASPStateappoggiano ad un solo ASPState• ““Velocino”Velocino”
• ControContro• Se crasha ASPState si perdono tutte le SessionSe crasha ASPState si perdono tutte le Session
External Session StateExternal Session State• Far partire il servizio ASPState sulla Far partire il servizio ASPState sulla
macchina indicata nel config.webmacchina indicata nel config.web• net start aspnet_statenet start aspnet_state
• Necessita di Premium EditionNecessita di Premium Edition• Altri 19 Mb di downloadAltri 19 Mb di download
• Tip: Se conosciuto meglio indicare Tip: Se conosciuto meglio indicare l’indirizzo IPl’indirizzo IP
• Tip2: Configurazione diversa fra test e Tip2: Configurazione diversa fra test e produzioneproduzione
Session fuori dal WPSession fuori dal WP<sessionState mode=“<sessionState mode=“SQLServerSQLServer“ “
timeout=“20” timeout=“20” sqlConnectionString="data sqlConnectionString="data source=127.0.0.1;user source=127.0.0.1;user id=sa;password="id=sa;password=" />/>
• ProPro• Se crasha l’applicazione le session sono salveSe crasha l’applicazione le session sono salve• Si può fare load balancing vero con N IIS che si Si può fare load balancing vero con N IIS che si
appoggiano ad un solo SQL Serverappoggiano ad un solo SQL Server• SQL in Cluster per Fault-toleranceSQL in Cluster per Fault-tolerance
• ControContro• Più lentoPiù lento• Configurare SQL in ClusterConfigurare SQL in Cluster
Custom User ControlCustom User Control• Creazione di controlli personalizzatiCreazione di controlli personalizzati• .ascx.ascx• Da riutilizzare nelle pagine ASPXDa riutilizzare nelle pagine ASPX• Simili alle “vecchie” #INCLUDESimili alle “vecchie” #INCLUDE• Ma sono classiMa sono classi
• Quindi espongonoQuindi espongono• ProprietàProprietà• MetodiMetodi• EventiEventi
User ControlsUser Controls• File .ascxFile .ascx• @Control Language=“vb”@Control Language=“vb”• Inserire i controlli Inserire i controlli • Get e Set per esporre i valori dei Get e Set per esporre i valori dei
controllicontrolli
• Nella Pagina che li utilizzaNella Pagina che li utilizza• <%Register TagPrefix=“mio” <%Register TagPrefix=“mio”
TagName=“Nome” Src=“xxx.ascx” %>TagName=“Nome” Src=“xxx.ascx” %>• <mio:Nome id=ctlNome runat=“server” /><mio:Nome id=ctlNome runat=“server” />• Utilizzo dei valori interni ctlNome.xxxUtilizzo dei valori interni ctlNome.xxx
• Caricare un controllo a RunTimeCaricare un controllo a RunTime• Page.LoadControl(string source)Page.LoadControl(string source)
• CustomizzarloCustomizzarlo• Dim ctl1 As UserControl Dim ctl1 As UserControl • ctl1 = LoadControl(“Toolbar.ascx") ctl1 = LoadControl(“Toolbar.ascx") • CType(ctl1, (Toolbar_ascx)).Titolo = CType(ctl1, (Toolbar_ascx)).Titolo =
“Home Page”“Home Page”
• Caricamento nella gerarchia della Caricamento nella gerarchia della paginapagina• Page.Controls.Add (ctl1)Page.Controls.Add (ctl1)
Ancora User ControlsAncora User Controls
ComponentiComponenti• Sono assembly .NET quindi creareSono assembly .NET quindi creare• .VB o .CS.VB o .CS• Namespace myCorsiNamespace myCorsi
• Public Class AttiviPublic Class Attivi• Public Function getCorsi(...)Public Function getCorsi(...)
• …………
• CompilazioneCompilazione• Vbc /t:library /out:myCorsi.dll myCorsi.vbVbc /t:library /out:myCorsi.dll myCorsi.vb• Con le librerie utilizzateCon le librerie utilizzate• E copiarlo nella directory BinE copiarlo nella directory Bin
ComponentiComponenti• Nella Pagina che li utilizzaNella Pagina che li utilizza
• <<%@Import Namespace=“%@Import Namespace=“myCorsimyCorsi” %” %>>
• Dim x as New myCorsi.AttiviDim x as New myCorsi.Attivi• ds = x.GetCorsi(….)ds = x.GetCorsi(….)
• Oppure copiarlo fuori dalla BinOppure copiarlo fuori dalla Bin• E usare la direttiva AssemblyE usare la direttiva Assembly
• Visual Studio automatizza il tuttoVisual Studio automatizza il tutto
CachingCaching• Il miglior modo di ottimizzare Il miglior modo di ottimizzare
un’applicazione è non eseguire il codiceun’applicazione è non eseguire il codice• Se i dati non cambiano in un arco di tempo Se i dati non cambiano in un arco di tempo
perchè rieseguire le query ?perchè rieseguire le query ?• Il codice statico è molto più veloce del Il codice statico è molto più veloce del
codice dinamicocodice dinamico
Cache LocationCache Location
• <%@OutputCache Location= “ “ %><%@OutputCache Location= “ “ %>• ServerServer• ClientClient• DownstreamDownstream• PublicPublic• NoneNone
• Da codiceDa codice• Response.Cache.SetCacheabilityResponse.Cache.SetCacheability
• HttpCacheability.ServerHttpCacheability.Server• HttpCacheability.ClientHttpCacheability.Client• ........
Partial CachingPartial Caching• Non è detto che si voglia sempre Non è detto che si voglia sempre
cachare tutta la paginacachare tutta la pagina• Sensato cachare solo le parti comuniSensato cachare solo le parti comuni• Partial Page CachingPartial Page Caching
• Consente di cachare User ControlConsente di cachare User Control• Ognuno con criteri diversiOgnuno con criteri diversi• La sintassi è identicaLa sintassi è identica• Attributo VaryByControlAttributo VaryByControl• Estensibile con ProprietàEstensibile con Proprietà
Data CachingData Caching• Application StateApplication State
• ApplicationApplication• Memoria condivisa per tutta l’applicazioneMemoria condivisa per tutta l’applicazione• Accesso tramite Nome/ValoreAccesso tramite Nome/Valore• Cachare i dati usati frequentementeCachare i dati usati frequentemente
• Esempio: Elenco prodottiEsempio: Elenco prodotti• Non usarla per dati temporaneiNon usarla per dati temporanei• Difficile impostare una scadenzaDifficile impostare una scadenza
• Esempio: L’elenco prodotti cambiaEsempio: L’elenco prodotti cambia
Data Caching – Cache APIData Caching – Cache API• Pensata per dati temporaneiPensata per dati temporanei
• Oggetto CacheOggetto Cache• Memoria condivisa per tutta l’applicazioneMemoria condivisa per tutta l’applicazione• Accesso tramite Nome/ValoreAccesso tramite Nome/Valore• Non è il nuovo oggetto ApplicationNon è il nuovo oggetto Application
• Cachare i dati usati di frequenteCachare i dati usati di frequente• Gli item usati “poco” vengono rimossiGli item usati “poco” vengono rimossi
• Attenzione !!!Attenzione !!!• Supporta la notifica di rimozione tramite il Supporta la notifica di rimozione tramite il
Delegate CacheItemRemovedCallBackDelegate CacheItemRemovedCallBack• Dipendenze (key, file, time)Dipendenze (key, file, time)
Cache DependencyCache Dependency
• Dependency da fileDependency da file• New CacheDependency(“xxx.yyy”)New CacheDependency(“xxx.yyy”)• Oppure su una directoryOppure su una directory• Oppure su un’altro item in cacheOppure su un’altro item in cache• Anche più di 1Anche più di 1
Error DebuggingError Debugging• VS.NET per debug completo anche per VS.NET per debug completo anche per
ASP.NETASP.NET• Call stack, breakpoint, watch window, eccCall stack, breakpoint, watch window, ecc
• ASP.NET Error Pages consento un ASP.NET Error Pages consento un tracking/debugging semplicetracking/debugging semplice
• Si abilita nel web.configSi abilita nel web.config• <compilation debugmode="true" /><compilation debugmode="true" />
• O nella singola paginaO nella singola pagina• <%@ Page Debug=“true” %> <%@ Page Debug=“true” %>
Error HandlingError Handling• .NET fornisce un meccanismo unificato .NET fornisce un meccanismo unificato
per gestire gli erroriper gestire gli errori• Utilizzando exceptionUtilizzando exception• Una call stack con tutte le informazioniUna call stack con tutte le informazioni• Try/Catch/Finally/Throw in tutti i linguaggiTry/Catch/Finally/Throw in tutti i linguaggi
• ASP.NET fornisce anche un metodo ASP.NET fornisce anche un metodo dichiarativodichiarativo• Per logging di erroriPer logging di errori• Redirige automaticamente l’utente ad una Redirige automaticamente l’utente ad una
pagina di gestione erroripagina di gestione errori
Oppure Application_ErrorOppure Application_Error• Scatta per tutte le eccezioni non gestiteScatta per tutte le eccezioni non gestite
• Accesso alla Request correnteAccesso alla Request corrente• Accesso all’oggetto ExceptionAccesso all’oggetto Exception• Prendere provvedimentiPrendere provvedimenti
• Pagina di errore generica Pagina di errore generica
• OppureOppure• Scrivere nell’Scrivere nell’EventLogEventLog
• Semplicissimo con la classe EventLogSemplicissimo con la classe EventLog• Mandare una mailMandare una mail
• Semplicissimo con la classe SmtpMailSemplicissimo con la classe SmtpMail
In generaleIn generale• Da ASP.NET non vi sono vincoli Da ASP.NET non vi sono vincoli
sull’accesso alle classi .NETsull’accesso alle classi .NET• Un altro esempioUn altro esempio
• Aggiungere Counter (Performance Monitor)Aggiungere Counter (Performance Monitor)• Per real-time monitoringPer real-time monitoring• EsempiEsempi
• Accesso ad una pagina particolareAccesso ad una pagina particolare• Totale iscrizioni onlineTotale iscrizioni online• Totale di quello che vi pareTotale di quello che vi pare
ASP.NET SecurityASP.NET Security
Token per processi e threadToken per processi e thread
cmd.execmd.exe
RobertoBRobertoB
cmd.execmd.exe
RobertoBRobertoB
LucaRLucaR
Molto spesso...Molto spesso...
• Il nostro codice usa array, oggetti, Il nostro codice usa array, oggetti, funzioni, ... per eseguire verifiche di funzioni, ... per eseguire verifiche di accessoaccesso
• Basate su Basate su • Nostri utentiNostri utenti• Nostri gruppi applicativiNostri gruppi applicativi• Memorizzati su DB o file di configurazioneMemorizzati su DB o file di configurazione
• Ci siamo quindi inventati meccanismi di Ci siamo quindi inventati meccanismi di autenticazione e autorizzazione autenticazione e autorizzazione proprietariproprietari
• Che esulano dai meccanismi WindowsChe esulano dai meccanismi Windows
CLR SecurityCLR Security• Ogni Thread nel CLR ha un Ogni Thread nel CLR ha un
Security PrincipalSecurity Principal• Su cui il codice può eseguire controlli di Su cui il codice può eseguire controlli di
accessoaccesso
• Un Security Principal del CLR può essereUn Security Principal del CLR può essere• Un WindowsPrincipalUn WindowsPrincipal
• Identity e Ruoli == al sistema operativoIdentity e Ruoli == al sistema operativo
• Un GenericPrincipalUn GenericPrincipal• Identity e Ruoli != dal sistema operativoIdentity e Ruoli != dal sistema operativo
• Un Security Principal deve avere almeno Un Security Principal deve avere almeno un’identityun’identity• WindowsIdentityWindowsIdentity• GenericIdentityGenericIdentity
Applicazione .NET Applicazione .NET
.NetApp.exe.NetApp.exe
RobertoBRobertoB
GI = New GenericIdentity “MioUtente”User = GI
RobertoBRobertoB
MioUtentMioUtentee
CLRCLR
WindowsWindows
If User.Name = “MioUtente” theneseguo...
ASP.NETASP.NET
• La configurazione determina il PrincipalLa configurazione determina il Principal• Del thread del SODel thread del SO• Del thread del CLRDel thread del CLR
• Sono ortogonaliSono ortogonali• IIS fornisce il token del thread del SOIIS fornisce il token del thread del SO
• L’autenticazione IIS si configura con il L’autenticazione IIS si configura con il metabasemetabase
• ASP.NET fornisce il principal per il ASP.NET fornisce il principal per il thread del CLRthread del CLR• L’autenticazione ASP.NET si configura con il L’autenticazione ASP.NET si configura con il
web.configweb.config
.ASPX.ASPX
Quindi di defaultQuindi di default
ClientClient
Sist.Sist.Oper.Oper.
I/OI/OServiziServizi
ecc.ecc.
IIS Anon.IIS Anon.
SystemSystem
ASP.NETASP.NET
ASPNETASPNET
IUSR_xxxIUSR_xxx
ASPNETASPNET
ThreadThread
ProcessProcess
.ASPX.ASPX
<processModel <processModel userName=“SYSTEM”>userName=“SYSTEM”>
ClientClient
Sist.Sist.Oper.Oper.
I/OI/OServiziServizi
ecc.ecc.
IIS Anon.IIS Anon.
SystemSystem
ASP.NETASP.NET
ASPNETASPNET
IUSR_xxxIUSR_xxx
SYSTEMSYSTEM
ThreadThread
ProcessProcess
.ASPX.ASPX
Anche se IIS blocca AnonimoAnche se IIS blocca Anonimo
ClientClient
Sist.Sist.Oper.Oper.
I/OI/OServiziServizi
ecc.ecc.
IIS Anon.IIS Anon.
SystemSystem
ASP.NETASP.NET
ASPNETASPNET
RobertoBRobertoB
SYSTEMSYSTEM
ThreadThread
ProcessProcess
ASP.NET ImpersonationASP.NET Impersonation
• Far passare il token di IIS sul thread di Far passare il token di IIS sul thread di ASPNET_WP.exeASPNET_WP.exe
• <configuration><configuration>• <system.web><system.web>
• <identity impersonate=“true” /><identity impersonate=“true” />• <system.web><system.web>
• </configuration></configuration>
.ASPX.ASPX
ImpersonationImpersonation
ClientClient
Sist.Sist.Oper.Oper.
I/OI/OServiziServizi
ecc.ecc.
IIS Anon.IIS Anon.
SystemSystem
ASP.NETASP.NET
ASPNETASPNET
IUSR_xxxIUSR_xxx
IUSR_xxxIUSR_xxx
ThreadThread
ProcessProcess
.ASPX.ASPX
se Blocco Anonimose Blocco Anonimo
ClientClient
Sist.Sist.Oper.Oper.
I/OI/OServiziServizi
ecc.ecc.
IIS Anon.IIS Anon.
SystemSystem
ASP.NETASP.NET
ASPNETASPNET
RobertoBRobertoB
RobertoBRobertoB
ThreadThread
ProcessProcess
ImpersonationImpersonation
• Si può impersonare anche un utente Si può impersonare anche un utente applicativo per tutta l’applicazioneapplicativo per tutta l’applicazione
• <identity impersonate=“true”<identity impersonate=“true”userName=“UtenteAppl”userName=“UtenteAppl”password=“Pippo” />password=“Pippo” />
• Per usare un solo utente che Per usare un solo utente che rappresenta l’applicazione rappresenta l’applicazione semplificando la gestione della semplificando la gestione della sicurezza sulle risorsesicurezza sulle risorse
• Quello che si fa(ceva) per COM+Quello che si fa(ceva) per COM+
Authentication VS AuthorizationAuthentication VS Authorization
• Authentication risponde alla domandaAuthentication risponde alla domanda• Chi Sei ?Chi Sei ?
• Authorization risponde alla domandaAuthorization risponde alla domanda• Cosa puoi fare ?Cosa puoi fare ?
• ASP.NET fornisce un’infrastruttura per ASP.NET fornisce un’infrastruttura per entrambientrambi
• Iniziamo dalla primaIniziamo dalla prima
Metodi di AuthenticationMetodi di Authentication
• NoneNone• Windows (default)Windows (default)
• Usato fino ad adessoUsato fino ad adesso
• FormsForms• PassportPassport
• Si impostano nel web.configSi impostano nel web.config
Windows AuthenticationWindows Authentication
• Lavora in una IntranetLavora in una Intranet• Con gli account e gruppi esistentiCon gli account e gruppi esistenti• Necessita di Impersonation TrueNecessita di Impersonation True
• Come abbiamo visto primaCome abbiamo visto prima
• Identity Thread CLRIdentity Thread CLR• User.Identity.NameUser.Identity.Name
• Identity Windows Identity Windows • WindowsIdentity.GetCurrent().NameWindowsIdentity.GetCurrent().Name
• Test di appartenenza a gruppiTest di appartenenza a gruppi• User.IsInRole(“Domain\Group”)User.IsInRole(“Domain\Group”)
Web.Config AuthorizationWeb.Config Authorization• Implementato da UrlAuthorizationModuleImplementato da UrlAuthorizationModule• Si applica a tutte le modalità di Si applica a tutte le modalità di
autenticazioneautenticazione• I permessi si impostanoI permessi si impostano
• Con Grant/DenyCon Grant/Deny• Per Utenti e RuoliPer Utenti e Ruoli
• In Windows Authentication gli utenti In Windows Authentication gli utenti devono corrispondere a quelli del SOdevono corrispondere a quelli del SO• Authority\principalAuthority\principal
• Il modulo ritorna “401” su Access DeniedIl modulo ritorna “401” su Access Denied• IIS gira il codice 401 in una richiesta di IIS gira il codice 401 in una richiesta di
autenticazioneautenticazione
Web.Config AuthorizationWeb.Config Authorization
• <configuration><configuration>• <system.web><system.web>
• <authorization><authorization>• <deny users=“?” /><deny users=“?” />• <allow roles=“Miestaff\Segreteria” /><allow roles=“Miestaff\Segreteria” />• <deny users=“*” /><deny users=“*” />
• </authorization></authorization>• <system.web><system.web>
• </configuration></configuration>
Forms AuthenticationForms Authentication
• L’autenticazione Windows non può L’autenticazione Windows non può essere usata per siti pubbliciessere usata per siti pubblici• Task amministrativi enormiTask amministrativi enormi• Non passa dai firewallNon passa dai firewall• Conoscere il Principal Windows rende il Conoscere il Principal Windows rende il
nostro sistema più attaccabilenostro sistema più attaccabile
• ASP.NET fornisce un’infrastruttura per ASP.NET fornisce un’infrastruttura per evitare di svilupparsi tutto a manoevitare di svilupparsi tutto a mano• Utilizza i cookieUtilizza i cookie• Automatizza le redirectionAutomatizza le redirection• Mini forma di amministrazione (manuale)Mini forma di amministrazione (manuale)
SignoutSignout
• FormsAuthentication.SignOut()FormsAuthentication.SignOut()• Elimina il cookieElimina il cookie• E quindi l’utente perde la sua identitàE quindi l’utente perde la sua identità• Nelle richieste successiveNelle richieste successive
• Altri metodiAltri metodi• GetAuthCookieGetAuthCookie• SetAuthCookieSetAuthCookie• EncryptEncrypt• DecryptDecrypt
TipsTips
• Usare HTTPS perUsare HTTPS per• Criptare il traffico di username e passwordCriptare il traffico di username e password• Criptare i cookie persistenti su discoCriptare i cookie persistenti su disco
• RedirectFromLoginPage(..., True)RedirectFromLoginPage(..., True)• Su tutto il sito per evitare che il cookie di Su tutto il sito per evitare che il cookie di
login passi in chiarologin passi in chiaro• Occhio ai tag IMG e HREFOcchio ai tag IMG e HREF
• Negare l’accesso Http a tutte le parti protette Negare l’accesso Http a tutte le parti protette per essere sicuriper essere sicuri
Proviamo a riepilogareProviamo a riepilogare
• Windows AuthenticationWindows Authentication• Per le intranetPer le intranet• Impersonation TrueImpersonation True
• Per far passare il SecurityPrincipal di IIS a Per far passare il SecurityPrincipal di IIS a ASP.NETASP.NET
• Customizzabile per i ruoliCustomizzabile per i ruoli
• Forms AuthenticationForms Authentication• Per siti web esterniPer siti web esterni• Gestione utenti automaticaGestione utenti automatica• O customizzabileO customizzabile• Ruoli gestibili da codiceRuoli gestibili da codice
Considerazioni finaliConsiderazioni finali• ASP.NET è una libreria di classi che ASP.NET è una libreria di classi che
consente lo sviluppo di applicazioni Web consente lo sviluppo di applicazioni Web dinamichedinamiche
• È possibile utilizzare tutte le librerie È possibile utilizzare tutte le librerie disponibili con il .NET Frameworkdisponibili con il .NET Framework
• Web Form e Web Controls permettono di Web Form e Web Controls permettono di trattare lo sviluppo Web in modo simile a trattare lo sviluppo Web in modo simile a quello Windowsquello Windows
• Insieme con le funzionalità di collegamento Insieme con le funzionalità di collegamento ai dati è possibile ridurre fortemente i ai dati è possibile ridurre fortemente i tempi di sviluppotempi di sviluppo
• Le prestazioni del codice compilato sono Le prestazioni del codice compilato sono molto superiori alle tecnologie interpretatemolto superiori alle tecnologie interpretate• ASP tradizionale, PHP, ecc.ASP tradizionale, PHP, ecc.
Link utiliLink utili• MSDN Academic AllicanceMSDN Academic Allicance
• http://www.msdnaa.nethttp://www.msdnaa.net • MSDN StudentiMSDN Studenti
• http://www.microsoft.com/italy/msdn/studentihttp://www.microsoft.com/italy/msdn/studenti • MSDN OnlineMSDN Online
• http://msdn.microsoft.comhttp://msdn.microsoft.com• GotDotNETGotDotNET
• http://www.gotdotnet.comhttp://www.gotdotnet.com• ASP.NETASP.NET
• http://www.asp.nethttp://www.asp.net• Windows FormsWindows Forms
• http://www.windowsforms.nethttp://www.windowsforms.net• DevLeapDevLeap
• http://www.devleap.ithttp://www.devleap.it• UgiDotNetUgiDotNet
• httphttp://www.ugidotnet.org://www.ugidotnet.org
© 2003-2004 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.