Benvenuti nel mondo Benvenuti nel mondo delle storie! delle storie!
BENVENUTI. 2 10.00Inizio 12.30Lunch 14.00Ripresa lavori 15.15Coffee Break 18.45Termine.
-
Upload
giosetta-bianchini -
Category
Documents
-
view
214 -
download
0
Transcript of BENVENUTI. 2 10.00Inizio 12.30Lunch 14.00Ripresa lavori 15.15Coffee Break 18.45Termine.
BENVENUTI
2
10.00 Inizio
12.30 Lunch
14.00 Ripresa lavori
15.15 Coffee Break
18.45 Termine
Cenni di licensing
4
• Individuale: 1 sviluppatore, 1 licenza (eccetto per MSDN Library)
• Indivisibile nei suoi componenti• Installazioni illimitate ma accesso singolo • Prodotti per Test & sviluppo, non utilizzabili in
produzione.
– Eccezioni:
• Office in MSDN Universal
• Downgrade– Si, ma senza utilizzo contemporaneo.
• MSDN è la soluzione!
• Perpetua (anche all’interno dei contratti di licensing)
5
Per tutti gli strumenti di sviluppo la Software Assurance è MSDN
6
Special Edition Windows Server™ 2003 Standard Edition *
SQL Server™ 2000 Developer Edition* Add-on Visual Studio Tools per Office MS Learning E-books and Certification Exam Vouchers Tre corsi multimediali di programmazione Microsoft .NET Framework (su ASP.NET, VB.NET e C++)
Descrizione Versione SKU Prezzo*
Visual Studio .NET Professional 2003 Special Edition
Standard 659-01570 € 992
Visual Studio .NET Professional 2003 Special Edition
Upgrade* 659-01579 € 676
•Diminuito il prezzo della versione full da 1.347€ a 992€•Nuova opzione di aggiornamento: versione Upgrade per i possessoridei tool standard della famiglia VS.NET 2002 e 2003.
7
Diverse versioni: Library, Operating System, Professional, Enterprise, UniversalDocumentazione Tecnica Beta e Service Pack Ultime versioni dei prodotti Diritto di accesso al sito MSDN Subscribers Download Interventi di supporto tecnico telefonico gratuiti:
MSDN Operating SystemsMSDN Operating Systems 2 incidents2 incidentsMSDN ProfessionalMSDN Professional 2 incidents2 incidentsMSDN EnterpriseMSDN Enterprise 3 incidents3 incidentsMSDN UniversalMSDN Universal 4 incidents4 incidents
Ricordarsi di attivare la licenza via Web dal sito MSDN!
8
•KIT MSDN Universal…e diventi MCP! 5.143 € 3.182 €
MSDN Universal3.353€ 3.182€
•Corso MOC 2310•Voucher esame 1.550€•Libro MOC
Programming Microsoft ASP.NET
•KIT MSDN Professional 1.511 € 1.332 €
MSDN Professional1.481€ 1.332€
Introducing Microsoft ASP.NET 2.0
9
• Hai una licenza Visual Studio .NET? E’ il momento di passare a MSDN: paghi solo la Software Assurance!
10
www.microsoft.com/italy/msdn/
• Per tutte le informazioni sui nostri eventi e webcast visitate
registratevi direttamente alla Newsletter MSDN Flash.
MCSD MCAD MCSE+I MCSA MCTMCSD MCAD MCSE+I MCSA MCT
12
• Faccio parte di www.DevLeap.com• Gruppo di consulenti che
– Erogano corsi e conferenze– Scrivono libri
• Alcuni saranno in omaggio oggi– Scrivono software– Fanno consulenza progettuale e implementativa
• Sito pubblico – Articoli tecnici – Cap 1 ASP.NET Full Contact disponibile al download– Blog per seguire la tecnologia
13
• ASP.NET è una tecnologia nuova per fare cose vecchie
• ASP.NET è parte del framework .NET– Ambiente object oriented– Nuovi linguaggi…oggi usiamo C#...non preoccupatevi– Nuovo modo di scrivere le cose– ADO.NET per l’accesso ai dati
• ASP.NET in quanto tale– Cambia il modo di scrivere pagine web– Cambia il modo di pensare le pagine web
• Oggi trattiamo ASP.NET– Non dimenticatevi che il framework .NET esiste !– Il buon programmatore ASP.NET conosce il framework
ClientClient ServerServer
Richiesta HTTPRichiesta HTTP
default.htmdefault.htm
IIS/ApacheIIS/Apache
Risposta HTTPRisposta HTTP
15
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
ClientClient ServerServer
Richiesta HTTPRichiesta HTTP
Active Server PagesActive Server Pagesengineengine
default.aspxdefault.aspx
IISIIS
JScriptJScriptVB / C#VB / C#EsecuzioneEsecuzione
ADO.NETADO.NET
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
17
• Time• For i = 1 to X
– Response
• Next
18
• <FORM action=“NomeRisorsa”><INPUT TYPE=“Text” NAME=“txtNome”><INPUT TYPE=“Text” NAME=“txtCognome”><INPUT TYPE=“Submit”>
• </FORM>• Le informazioni vengono inviate a “NomeRisorsa”
sotto forma di stringhe– txtNome=xxxx&txtCognome=yyyy
• Nel QueryString
19
• Contiene le info del QueryString
<% first=Request.QueryString("txtfname")%> <% first=Request.QueryString("txtfname")%>
<% first=Request.QueryString(“txtfname”) last =Request.QueryString(“txtlname”) Response.Write(“Welcome” & first & last)%>
<% first=Request.QueryString(“txtfname”) last =Request.QueryString(“txtlname”) Response.Write(“Welcome” & first & last)%>
20
• <FORM action=“NomeRisorsa” METHOD=“POST”><INPUT TYPE=“Text” NAME=“txtNome”><INPUT TYPE=“Text” NAME=“txtCognome”><INPUT TYPE=“Submit”>
• </FORM>• Le informazioni vengono inviate a “NomeRisorsa”
sotto forma di stringhe– txtNome=xxxx&txtCognome=yyyy
• Nel form (non si vedono nel Querystring)
21
• Contiene le info del Form
<% first=Request.Form("txtNome")%> <% first=Request.Form("txtNome")%>
<% first=Request.Form(“txtNome”) last =Request.Form(“txtCognome”) Response.Write(“Ciao” & first & last)%>
<% first=Request.Form(“txtNome”) last =Request.Form(“txtCognome”) Response.Write(“Ciao” & first & last)%>
22
• Ogni richiesta è a se stante• Non esistono informazioni di stato in Http• Per ogni richiesta dobbiamo preoccuparci di
inviare il contenuto• Ad esempio riempire i campi di un form con le
informazioni digitate dall’utente
23
• Ripresentare le informazioni digitate• <INPUT • TYPE=“TEXT” • NAME=“txtNome” VALUE=<
%=Request.QueryString(“txtNome”)%>• >
24
• <FORM action=“NomeRisorsa” METHOD=“POST”runat”server”><INPUT TYPE=“Text” ID=“txtNome”
runat=“server”><INPUT TYPE=“Text” ID=“txtCognome”
runat=“server”><INPUT TYPE=“Submit”>
• </FORM>
• I controlli mantengono lo stato
25
• Recupero valori digitati in automatico
• Poi aggiungiamo il codice per contare
26
• Oggetti programmabili• Attributo runat=“server”• Mantengono lo stato delle info• Generano HTML per il client• Espongono
– Proprietà– Metodi
• Scatenano eventi
27
• <input type=“text” value=“default” runat=“server” id=“txtName” >
• Mappano i tag HTML 1:1• Lavorano bene con gli Editor attuali• Ma il modello ad oggetti non è strongly-typed
– Ad esempio• txtName.Value = “Roberto”• txtName.SetAttribute("bgcolor", "red")
28
• <input • type=“Submit” • value=“Premi”
runat=“server”• onServerClick=“EseguiOperazioni”>
– onClick verrebbe inviato al client– In generale ogni attributo non utilizzato server-side o
sconosciuto viene inviato al client
29
• Definizione evento• Gestione evento
• Notare– Occhio ai Convert
• .NET è tipizzato• Il Web è “stringato”
– Occhio alla Response• Esecuzione non sequenziale• Vedere il Source• Usare ad esempio <div runat=server>
30
• I controlli server mantengono le proprietà impostate fra round-trip
• Tramite un campo hidden– __VIEWSTATE
• Pro– Meno plumbing– Meno roundtrip verso i dati
• Contro– __VIEWSTATE occupa banda– E’ disabilitabile
31
• ViewState– View Source
• Modifica attributo al click– Azzera: Cambia colore pulsante
• Disable su Controllo– Non tiene il bgcolor
• Disable su Pagina– Non tiene il bgcolor
• Comunque txtConta ha sepre il valore– Perchè ?
32
• HTML Control– Sintassi HTML– Mappati 1:1 con controlli HTML– Namespace System.Web.UI.HtmlControls
• Web Controls– Sintassi diversa– Tutti gli HTML Control
• Più controlli avanzati– Maggiori funzionalità
33
• <asp:TextBox runat=“server” id=“txtName” Text=“default”></asp:TextBox>
• Modello ad oggetti consistente e strongly-typed – txtName.Text = “Roberto”– txtName.BackColor = Color.Red
• Rendering differente per browser– Esempio: Label
• Funzionalità differenti per browser– Esempio: Validation Control
34
35
• <asp:TextBox ...– Strongly-typed– BackColor=“red”
• <asp:ListBox ...– Mantenere lo stato significa anche riposizionare la
combo-box– Si possono aggiungere elementi
– Reflector (listbox.rendercontents)
36
• Per chi arriva da ASP 3.0, PHP o altri ambienti di scripting server-side
• Più vicino a VB 6.0• Label per i testi “fissi”• TextBox e compagni per l’input
37
• List Control – Iterativi su una base di dati
• DropDownList, ListBox, RadioButtonList, CheckBoxList• Repeater, DataList, DataGrid
• Validation Control– Ci arriviamo fra poco…
• Controlli complessi (Rich Control)– Calendar, AdRotator, Xml
• Mobile Control: per device e telefonini• Internet Explorer Control
38
• Anche la pagina è un oggetto• La classe deriva da System.Web.UI.Page• Si possono costruire variabili membro• HTML diventa parte del metodo Render• Il codice di rendering diventa parte del metodo
Render• WebForm e Controlli Server-side sono costruiti
sulla classe Page
ASPXASPXFileFile
RequestRequest
ASPXASPX
EngineEngine
ParsingParsing
ClassFilesu
Disco
GenerazioneGenerazione
PagePage
ClassClass Istanza, Istanza, Esecuzione Esecuzione e Renderinge Rendering
ResponseResponse
RequestRequestCreazioneCreazione
IstanzaIstanza
ResponseResponse
Code-Code-behindbehind
filefile
40
• A livello di pagina• @Page controlla la compilazione
– Molti attributi
• @Assembly per referenziare un assembly esterno– Come /r nei compilatori VBC.exe e CSC.exe
• @Import per importare un namespace– Imports di VB.NET– using di C#;
41
ElencoCorsi.aspxElencoCorsi.aspx
<%@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
42
Language Linguaggio utilizzato
Buffer Response Buffering True/False
ContentType Header Content Type MIME
EnableSessionState Session True/False
EnableViewState ViewState True/False
Src File sorgente per code-behind
Inherits Base Class diverse da Page
ErrorPage URL per eccezioni non gestite
Explicit Option Explicit True/False
Strict Option Strict True/False
Debug Compilazione con simboli True/False
Trace Tracing True/False
CompilerOptions Switch per VBC.exe o CSC.exe
43
• Page Events– Page_Init– Page_Load– Page_Unload– La routine di evento riceve gli argomenti .NET
44
• Evento Load• Riempire una ListBox
• Occhio al POST– Aggiunge sempre elementi– Perchè la listbox mantiene il suo stato
45
• If Request.ServerVariables(“HTTP_METHOD”) diventa
• If Page.IsPostBack– Proprietà della classe Page– True se POST– False se GET
46
• Evento Load• Riempire una ListBox solo in Get
• I controlli mantengono lo stato
47
• ASP.NET gestisce client-side validazioni e server-side
• Client-side Validation – Dependent on browser version– FeedBack immediato– Riduce i round-trip
• Server-side Validation– Riesegue le validazioni– Controllo su fonte dati
Valido?
Valido?
UserInserimento
No
No
Si
Si
Msg Errore
Client
Server
Web ApplicationProcessing
48
• Controllo Obbligatorietà Campo• Gestione errore client-side
– Non necessita di post– Risparmia round-trip
• Gestione errore server-side– Il controllo viene rieffettuato– Evita problemi
• Con browser che non supportano Javascript• Con i malintenzionati
• Non ferma l’esecuzione Server-side...giustamente– Demo 17 Page.IsValid
49
• Con i Server Control (<asp:) automatico in base alle capacità del browser
• ClientTarget="DownLevel“• ClientTarget=“UpLevel“
– I controlli diventano span• sytle=“color:red ; visibility:hidden”
– Usa Javascript sul client
50
• Uno solo per pagina• @Page
CodeBehind=“Codice.vb/cs” Inherits=“Classe”
• Nel file Codice.vb/cs– Definire Classe protected
• Derivare da System.Web.UI.Page• Poi il codice da usare con la pagina• Eventi• Funzioni
51
• Visual Studio .NET• File con estensione VB / CS• Definisce una classe
– Nomepagina– Deriva da System.Web.UI.Page– Implementa le funzionalità custom
• Stiamo specializzando una classe !!!
52
• Ci svela molti segreti• Espone
– Proprietà• Request / Response
– Metodi• DataBind• OnInit• OnLoad
– Eventi• Init / Load / UnLoad
– ...
53
• Deriva da System.Web.UI.TemplateControl– A sua volta deriva da System.Web.UI.Control
• La pagina è un controllo !!!– E’ il controllo che espone tali caratteristiche
• Tutto il rendering è effettuato dal metodo Render– Non sequenzialità
• Come abbiamo visto prima– Ogni controllo specializza il Render
54
• Implementato da Control• Si incarica di eseguire il rendering del contenuto
del controllo• Dichiarato come virtual• Possiamo specializzarlo
– protected void Render(...)– Volendo richiamando base.Render(...)
55
• Separare il layout dal codice• Uno solo per pagina• @Page
CodeBehind=“Codice.vb/cs” Inherits=“Classe”
56
• Il Code Behind non è un’appendice della pagina ma la classe da cui viene ereditata la pagina
57
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
58
• Insieme di pagine aspx (e codebehind)• Rappresentata da una directory
– E sottodirectory
• Configurazione ad-hoc• Condivisione aree di memoria• Eventi a livello applicativo
– Start– End– BeginRequest– EndRequest
59
• Application_Start– Creo counter nel performance monitor– DevLeap / Richieste Totali
• Application_BeginRequest– Sommo 1 al contatore
60
• Application_Start– solo se è la prima richiesta per questa applicazione
• BeginRequest• AuthenticateRequest• AuthorizeRequest• ResolveRequestCache• Inizializzazione del gestore della risorsa
– ad esempio la pagina aspx• Session_Start
– solo se le Session sono abilitate ed è la prima richiesta del browser per quest’applicazione
• AcquireRequestState• PreRequestHandlerExecute• Esecuzione della pagina• PostRequestHandlerExecute• ReleaseRequestState• UpdateRequestCache• EndRequest
61
• File di configurazione• In formato XML
– Occhio !!! È case sensitive• Per impostare parametri applicativi
– Opzioni di compilazione– Sicurezza– Gestione delle sessioni– Moduli HTTP (HttpModule) custom– Handler HTTP
• Sovrascrive le impostazioni di default– %WinDir%\Microsoft.NET\Framework\<versione>\CONFIG\
Machine.Config
62
• Può contenere costanti applicative– Connection String– Indirizzo Email WebMaster
• <appSettings>• <add key=“EMail” value=“[email protected]” />
– </appSettings>
• Nel codice– strConn = Configuration.AppSettings(“EMail”)
63
• “Semplice”
• <configuration> • <system.web>• <customErrors mode=“remoteonly”
defaultRedirect=“error.htm”/>• </system.web>• </configuration>
64
• “Avanzato”
• <configuration> • <system.web>• <customErrors mode=“On” defaultRedirect=“error.htm”>• <error statusCode=“404”
redirect=“NotFound.htm”/>• <error statusCode=“401”
redirect=“NoAccess.htm”/>• </customErrors>• </system.web>• </configuration>
65
• Scatta per tutte le eccezioni non gestite– Accesso alla Request corrente– Accesso all’oggetto Exception– Prendere provvedimenti
• Pagina di errore generica
• Oppure– Scrivere nell’EventLog
• Semplicissimo con la classe EventLog– Mandare una mail
• Semplicissimo con la classe SmtpMail
67
INETINFO.exeINETINFO.exe
ISAPI ISAPI Extension Extension ManagerManager
ASP.NETASP.NETWorker 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/ASP per ASP.NET non usa ISAPI/ASP per eseguire il codiceeseguire il codice
• ISAPI Extension ASPNET_ISAPI.DLL ISAPI Extension ASPNET_ISAPI.DLL redirige le richieste sul worker redirige le richieste sul worker process di ASP.NETprocess di ASP.NET
68
ASPNET_WP.EXEASPNET_WP.EXE
HttpRuntimeHttpRuntimeClassClass Modulo 1Modulo 1 Modulo 2Modulo 2 PageHandlerPageHandler
Pagina1.aspxPagina1.aspx
HttpRuntimeHttpRuntimeClassClass Modulo 1Modulo 1 Modulo 2Modulo 2 PageHandlerPageHandler
Pagina2.aspxPagina2.aspx
ASP.NET worker thread 1ASP.NET worker thread 1
ASP.NET worker thread 2ASP.NET worker thread 2
69
ASPNET_WP.EXEASPNET_WP.EXE
HttpRuntimeHttpRuntimeClassClass AuthentAuthent AuthorizAuthoriz PageHandlerPageHandler
Pagina1.aspxPagina1.aspx
HttpRuntimeHttpRuntimeClassClass AuthentAuthent PageHandlerPageHandler
Pagina2.aspxPagina2.aspx
ASP.NET worker thread 1ASP.NET worker thread 1
ASP.NET worker thread 2ASP.NET worker thread 2
70
• <httpModules>• <add name="OutputCache"
type="System.Web.Caching.OutputCacheModule"/>• <add name="Session"
type="System.Web.SessionState.SessionStateModule"/>• <add name="WindowsAuthentication"
type="System.Web.Security.WindowsAuthenticationModule"/>• <add name="FormsAuthentication"
type="System.Web.Security.FormsAuthenticationModule"/>• <add name="PassportAuthentication"
type="System.Web.Security.PassportAuthenticationModule"/>• <add name="UrlAuthorization"
type="System.Web.Security.UrlAuthorizationModule"/>• <add name="FileAuthorization"
type="System.Web.Security.FileAuthorizationModule"/>
• </httpModules>
71
• Gestore della risorsa• Ogni estensione viene legata ad un HttpHandler• Come in Windows: ogni estensione è legata ad un
programma• Esistono diversi HttpHandler di default
72
• <httpHandlers>• <add verb="*" path="trace.axd"
type="System.Web.Handlers.TraceHandler"/>• <add verb="*" path="*.aspx" • type="System.Web.UI.PageHandlerFactory"/>• <add verb="*" path="*.ashx" • type="System.Web.UI.SimpleHandlerFactory"/>• <add verb="*" path="*.asmx"
type="System.Web.Services.Protocols.WebServiceHandlerFactory, System.Web.Services, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>
• <add verb="*" path="*.rem" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>
• <add verb="*" path="*.soap" type="System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" validate="false"/>
73
• <add verb="*" path="*.asax" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.ascx" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.cs" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.csproj" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.vb" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.vbproj" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.webinfo"
type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.asp" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.licx" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.resx" type="System.Web.HttpForbiddenHandler"/>• <add verb="*" path="*.resources"
type="System.Web.HttpForbiddenHandler"/>• <add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>• <add verb="*" path="*"
type="System.Web.HttpMethodNotAllowedHandler"/>• </httpHandlers>
75
• Il Web è stateless• Mantenere lo stato delle informazioni
– Valori– Variabili– Proprietà
• Server-Side per riutilizzarli fra richieste diverse• Sulla stessa pagina• Sull’intera applicazione
76
• Server Side– Web.Config– Application – Session (se cookie andrebbe dopo)– Caching
• Client/Server Side– Cookie – Hidden Field– QueryString– ViewState
77
• Classe HttpApplicationState• Oggetto Application• Esposto come proprietà di
– HttpContext e Page
• Memoria condivisa per tutta l’applicazione– Indipendente dall’utente– Accesso tramite Nome/Valore– Non usarla per dati temporanei
• Difficile impostare una scadenza
• Da non confondere con la classe HttpApplication esposta come ApplicationInstance che rappresenta l’intera applicazione ASP.NET e non un’area di memoria
78
• In ASP 1/2/3 le session – Necessitano del supporto dei cookie sul client– Sono single-machine e non adatte a configurazioni in
load-balancing– Consumano molta RAM
• In ASP.NET le session– Possono lavorare come prima oppure– Non necessitare dei cookie– Essere multi-machine– Appoggiarsi su DB o su uno State Server
79
• Classe HttpSessionState• Oggetto Session• Esposto come proprietà di
– HttpContext e Page
• Memoria condivisa per tutta l’applicazione– Dipendente dall’utente– Accesso tramite Nome/Valore– Non usarla per dati temporanei
• Difficile impostare una scadenza
• Implementata dal modulo System.Web.SessionState.SessionStateModule
80
BrowserBrowserServerServer
BrowserBrowser SessionSession
SessionSession
CookieCookie
CookieCookie
URL SessURL Sess
URL SessURL Sess
ASPNET_WP.EXEASPNET_WP.EXE
HttpRuntimeHttpRuntimeClassClass Modulo XModulo X SessionSession HTTP HandlerHTTP Handler
Pagina1.aspxPagina1.aspx
HttpRuntimeHttpRuntimeClassClass Modulo XModulo X SessionSession HTTP HandlerHTTP Handler
Pagina2.aspxPagina2.aspx
ASP.NET worker thread 1ASP.NET worker thread 1
ASP.NET worker thread 2ASP.NET worker thread 2
81
• Session(“nome”) = Valore• Response.Write(Session(“nome”))• Non occorre definire le varibili
– Come nella vecchia versione– Ma occhio a controllarne l’esistenza prima di utilizzarne
un valore– Oppure valorizzare tutte la var nel Session_OnStart
82
• <sessionState mode="Off|Inproc|StateServer|SQLServer" cookieless="true|false"
• timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" />
• Off se non si usa
83
• <sessionState cookieless=“true" />
• Non necessita di cookie abilitati sul client• Il cookie viene copiato nei vari Url linkati dalla pagina
– Http://xxx.com/3463287462764/pagina.aspx
• Utilizzabile in tutte le modalità– Session.Mode
• Gestiti dal filtro ISAPI ASPNET_FILTER.DLL
84
<sessionState mode=“InProc” cookieless="true|false" <sessionState mode=“InProc” cookieless="true|false" /> />
• Più velocePiù veloce
• Singolo Server – No Load BalancingSingolo Server – No Load Balancing
• Se ASPNET_WP crasha – Addio SessionSe ASPNET_WP crasha – Addio Session
BrowserBrowser
ASPNET_WPASPNET_WP
BrowserBrowser SessionSession
SessionSession
CookieCookie
CookieCookie
URL SessURL Sess
URL SessURL Sess
85
<sessionState mode=“StateServer” cookieless="true|false" <sessionState mode=“StateServer” cookieless="true|false"
stateConnectionString="tcpip=server3:42424" stateConnectionString="tcpip=server3:42424" /> />
• ASPNET_STATE Può girare anche sullo stesso serverASPNET_STATE Può girare anche sullo stesso server
• Se ASPNET_WP crasha – Le Session sopravvivonoSe ASPNET_WP crasha – Le Session sopravvivono
• Più lento di InProcess – Più veloce di SQL Server SessionPiù lento di InProcess – Più veloce di SQL Server Session
• Load BalancingLoad Balancing
• Se crasha ASPNET_STATE – Addio Sessioni di tutti i serverSe crasha ASPNET_STATE – Addio Sessioni di tutti i server
BrowserBrowser
ASPNET_WPASPNET_WP
SERVER 2SERVER 2BrowserBrowserCookieCookie
CookieCookie
URL SessURL Sess
URL SessURL SessASPNET_STATEASPNET_STATE
SERVER 3SERVER 3
SessionSessionBrowserBrowser CookieCookieURL SessURL Sess
ASPNET_WPASPNET_WP
SERVER 1SERVER 1
SessionSession
SessionSession
86
<sessionState mode=“SQLServer” cookieless="true|false" <sessionState mode=“SQLServer” cookieless="true|false"
sqlConnectionString=“ConnString” sqlConnectionString=“ConnString” /> />
• SQL può girare anche sullo stesso serverSQL può girare anche sullo stesso server
• Se ASPNET_WP crasha – Le Session sopravvivonoSe ASPNET_WP crasha – Le Session sopravvivono
• Metodo più lento ma più sicuro (se in cluster)Metodo più lento ma più sicuro (se in cluster)
• Load Balancing Load Balancing
BrowserBrowser
ASPNET_WPASPNET_WP
SERVER 2SERVER 2BrowserBrowserCookieCookie
CookieCookie
URL SessURL Sess
URL SessURL Sess
SessionSessionBrowserBrowser CookieCookie
URL SessURL Sess
ASPNET_WPASPNET_WP
SERVER 1SERVER 1
SessionSession
SessionSession
Sql Sql Server oServer o
Sql Sql ClusterCluster
87
• %WinDir%\Microsoft.NET\Framework\vxxxx\InstallSQLState.sql
• Per creare Database e Stored Procedure– DataBase: ASPState– SP: Insert, Get, Update
• I dati vengono appoggiati al TEMPDB– Al Restart di SQL Server le Session vengono perse– Possiamo modificare InstallSQLState per creare e
appoggiare i dati su un altro DB
• Nella 1.1 InstallPersistSQLState.sql
88
0
200
400
600
800
1000
1200
1400
ASP.NET InProc ASP.NET State Store ASP.NET SQL Store
Req
ues
ts/S
ec (
2P S
erve
r)
89
• Non abbiamo più i problemi di ASP 3.0– Nessun problema di COM Affinity– Load Balancing consentito
• Detto questo, non usatele se non ne avete bisogno– Togliere l’HttpModule da Machine.Config
• e <page enableSessionState=“false” />– Togliere il modulo dal Web.Config
• <httpModules>– <remove name=“Session” />
• </httpModules>• e <page enableSessionState=“false” />
– Disabilitare le session sulle pagine che non le utilizzano• @Page EnableSessionState=“false”
– Se una pagina legge solamente i valori senza scriverli• @Page EnableSessionState=“readonly”
90
• Proprietà della classe Control• Contiene le informazioni di stato dei controlli• Dictionary della classe State• Si trasforma in un campo hidden
– Dopo Base64 Encoding – __VIEWSTATE
• Per default è null o empty• I valori possono essere letti e scritti anche da codice
– ViewState[“xxx”] = “ABC”
• http://blogs.aspitalia.com/ricciolo/category26.aspx
92
• Il miglior modo di ottimizzare il codice è• Non eseguirlo !!!• Se i dati non cambiano in un arco di tempo
perchè rieseguire le query ?• Il codice statico è molto più veloce del codice
dinamico• Torniamo a FrontPage
– Mai ! magari a DreamWeaver
93
• Implementato da System.Web.Caching.OutputCacheModule
ASPNET_WP.EXEASPNET_WP.EXE
HttpRuntimeHttpRuntimeClassClass OutputCacheOutputCache SessionSession HTTP HandlerHTTP Handler
Pagina1.aspxPagina1.aspx
HttpRuntimeHttpRuntimeClassClass OutputCacheOutputCache HTTP HandlerHTTP Handler
Pagina2.aspxPagina2.aspx
ASP.NET worker thread 1ASP.NET worker thread 1
ASP.NET worker thread 2ASP.NET worker thread 2
CacheCache
94
• La pagina viene eseguita la prima volta– Viene cachata – E recuperata dalla cache per le richieste successive
• Direttiva di cache per la pagina– <%@ OutputCache Duration=“10”
VaryByParams=“none” %>
• Oppure da codice– Response.Cache.SetExpires(DateTime.Now.AddSeconds(
10))
95
• La pagina potrebbe essere diversa in base al QueryString o alla POST
• VaryByParam– Cacha n copie della pagina in base ai parametri HTTP
GET / POST– Indicare i parametri da considerare separati da “;”– Supporta * (per tutti i parametri)– Esempio VaryByParam=“TipoCorso; SedeCorso”– Parametro obbligatorio
• Impostarlo a ‘none’
97
• Classe Cache• Namespace System.Web.Caching• Oggetto Cache
– Esposto da Page.Response
• Memoria condivisa per tutta l’applicazione– Indipendente dall’utente– Accesso tramite Nome/Valore– Usarla per dati temporanei– Gli item usati “poco” vengono rimossi
• Supporta la notifica di rimozione tramite il Delegate CacheItemRemovedCallBack
98
• Cache.Add o Cache.Insert• (
Nome,Valore,Dependency,Time,TimeSpan,Priority,CallBack
• )
100
• None• Windows (default)• Forms• Passport
• Si impostano nel web.config
101
• Lavora in una Intranet• Con gli account e gruppi esistenti• User.Identity.Name per Thread CLR• WindowsIdentity.GetCurrent().Name
per Thread SO• Test di appartenenza a gruppi
– User.IsInRole(WindowsBuiltInRole.Administrator)– User.IsInRole(“DevLeap\Administrators”)
• Domain\Group -> Domain\\Group in C#
102
• L’autenticazione Windows non può essere usata per siti pubblici– Task amministrativi enormi– Non passa dai firewall– Conoscere il Principal Windows rende il nostro sistema
più attaccabile
• ASP.NET fornisce un’infrastruttura per evitare di svilupparsi tutto a mano– Utilizza i cookie– Automatizza le redirection– Completamente customizzabile
103
• Selezionare Forms Authentication nel web.config– <authentication mode=“Forms” >
• Scegliere una pagina di login• <forms loginUrl=“login.aspx” />
• Opzionalmente dare un nome al cookie– Name=“App1”– Default: .ASPAUTH
104
• <forms loginUrl=“Login.aspx”><credentials passwordFormat=“Clear”>
<user name=“RobertoB” password=“Pippo”/><user name=“LucaR” password=“Pippo”/>
</credentials>
• </forms>
• Password Case Sensitive• Possono essere criptate
105
• Creare i campi di login– Username e password
• Inserire un pulsante di Login• Creare il codice per l’evento Click
– Usare la classe FormsAuthentication• If FA.Authenticate(usr, pwd)
– FA.RedirectFromLoginPage(usr)
106
• Utenti in un Database• Pagina di Login
– Al login controlliamo gli account con le nostre regole in un database
– Usiamo la Redirect automatica– Che ci crea anche il cookie di login
• Demo LoginDb.aspx
107
• Implementato da UrlAuthorizationModule• Si applica a tutte le modalità di autenticazione• I permessi si impostano
– Con Grant/Deny– Per Utenti e Ruoli
• Se Windows Authentication gli utenti corrispondono a quelli del SO– Authority\principal– Il modulo ritorna “401” su Access Denied
• IIS gira il codice 401 in una richiesta di autenticazione
108
• <configuration><system.web>
<authorization><deny users=“?” /><allow users=“Dominio\Utente” /><allow roles=“Dominio\Gruppo” /><deny users=“*” />
</authorization><system.web>
• </configuration>
110
• ASP Vs. ASP .NET• Debug.Assert ((VB.NET <> VB6) And
(VB.NET<>VBScript))• <% …%>• COM o non COM, questo è il dilemma…• Demo Ugrade
111
• L'installazione di ASP .NET non impedisce il funzionamento delle applicazioni ASP esistenti
• Le applicazioni ASP e ASP .NET:– possono essere eseguite side-by-side (usano estensioni
di file differenti)– non condividono Session e Application
• Anche se è possibile farlo scrivendo tanto codice– Sono comunque possibili strategie di migrazione parziale
112
• Il codice eseguito:– E’ compilato– Può utilizzare tutte le classi del Framework .NET– È un ambiente può “visuale” e produttivo– Sessioni cookieless e scalabili in una web farm– E’ un ambiente Object Oriented– E’ tipizzato– E’ tipizzato– E’ tipizzato
113
• Gli oggetti Request e Response sono ancora supportati
• Gli include funzionano ancora• Supportano codice applicativo frammisto ad
HTML• La direttiva Language è ancora supportata (in
realtà viene sottointeso Page)• VB .NET sa “imitare” fin troppo bene VBScript
114
• Le pagine ASP .NET supportano un solo linguaggio• Le pagine ASP .NET supportano più di una
direttiva• è necessario dichiarare le funzioni nelle pagine
ASP.NET in blocchi <script runat=server><% Sub DoSomething() Response.Write “Ciao a tutti !!!" End Sub
DoSomething%>
<script language="VB" runat=server> Sub DoSomething() Response.Write (“Ciao a tutti !!!") End Sub</script><% DoSomething()%>
115
• ASP.NET non supporta le funzioni di rendering di pagina
<% Sub RenderSomething() %> <font color="red"> Sono le ore: <%=Now %> </font><% End Sub %>
<% RenderSomething RenderSomething%>
<script language="VB" runat=server>
Sub RenderSomething() Response.Write("<font color=red> ") Response.Write(“Sono le ore: " & Now) End Sub
</script>
<% RenderSomething() RenderSomething()%>
116
• Option Explicit è impostato per default• è necessario dichiarare le variabili aventi scope
page-level in blocchi <script runat=server>• le "pagine" ASP .NET si chiamano Web Form • Molti dei settaggi di IIS per le applicazioni
ASP.NET vengono ignorati– La configurazione sta in ASP.NET
• Web.config• Machine.config
117
• Eliminazione di Set e Let• Eliminazione delle proprietà predefinite non
indicizzate• Le parentesi sono necessarie per chiamare
procedure/funzioni (anche se non hanno parametri)• per default, gli argomenti sono passati ByVal• Possiamo avvalerci della tipizzazione• VB.NET e C# simili
– CLI– CLS
118
• Il CLR consente agli oggetti .NET di interagire senza (particolari) difficoltà con i componenti COM tradizionali.
• Un componente può essere istanziato:– in late binding mediante Server.CreateObject(ProgId)– in early binding greando un assembly di interoperabilità
usando tblimp.exe o VS .NET– Mediante il tag <object>
• L’uso di componenti non free-threaded richiede l’inserimento dell’attributo ASPCompat=“True” nella direttiva Page
119
• demo
120
• Le applicazioni ASP “serie” non accedono al db, perché:– Ci hanno insegnato a implementarle con architettura
multi-tier– Ci hanno detto di incapsulare l’accesso ai dati e le regole
di business in componenti COM
• …e ora? • Possiamo migrare in 2 fasi:
– Pagine ASP Web Form ASP .NET– Server COM Assembly .NET
121
• demo
123
• Accesso a qualsiasi fonte dati relazionale e non– Privilegiato verso SQL Server– Dalla 1.1 privilegiato SQL Server / Oracle
• Modalità connessa alla fonte dati– Accesso ai dati in streaming
• Read-only, Forward-only– Performances e scalabilità– Nessun utilizzo involontario di cursori server-side
• Da gestire esplicitamente con comandi T-SQL• Modalità disconnessa dalla fonte dati
– Funzionalità estese di caching in-memory– Aggiornamenti batch– Indipendenza dalla fonte dati– Rappresentazione interna in XML
124
.NET Application.NET Application
ODBCODBC
OLE DBOLE DB
Other DBMSOther DBMSNon-relationalNon-relational
sourcessources
OLE DB ProviderOLE DB Provider
SQL ServerSQL Server
TD
TD
SS
System.Data.SqlClientSystem.Data.SqlClient System.Data.OleDbSystem.Data.OleDbOtherOther
Other DSOther DS
DataSetDataSet
System.Data.OdbcSystem.Data.Odbc
125
• Insieme di oggetti che implementano le interfacce di base per il data access– IDbConnection– IDbCommand– IDbDataReader– IDbDataRecord– IDbDataAdapter
• Creati come layer leggero tra la fonte dati e l’applicazione• Realizzati come codice Managed all’interno del .NET
Framework• Costituiscono la parte “connessa” alle varie fonti dati• Permettono l’utilizzo di comandi diretti verso le fonti dati
attraverso gli oggetti Command– Chiamata a Stored Procedure– Codice SQL dinamico
126
• Nella v 1.0 ce ne sono due– SqlClient– OleDb– Altri installabili
• Nella v 1.1– ODBC– OracleClient di Microsoft– SqlServerCe
• Altri fornitori– Oracle da Oracle– “SqlServer” per la gestione di risorse lato server
• SQL Server 2005
127
• È composto completamente da codice Managed• Contiene un parser TDS per comunicazioni efficienti con
SQL Server 7.0 o 2000• Non utilizza direttamente i cursori server di SQL Server
– Transazioni– Comandi T-SQL espliciti (OPEN CURSOR, sp_cursor,
sp_executesql ecc.)
• Permette di interagire con le funzionalità XML di SQL Server 2000– ExecuteXmlReader() di SqlCommand ritorna uno stream di
informazioni in XML
128
SqlConnection
SqlCommand
.SqlParameterCollectionSqlDataReader
.Connection
.SqlParameter
.CreateCommand
.Parameters
.Item
.Add
.CreateParameter
.ExecuteReader
System.Xml.XmlReader
.ExecuteXmlReader
Object
.Item
129
• Implementa l’interfaccia IDbConnection• Utilizzando la modalità “connessa” occorre aprire e chiudere
manualmente la connessione– Con SqlCommand e SqlDataReader– Chiamando il metodo Close o Dispose
• Permette di creare transazioni locali attraverso la BeginTransaction– Ritorna un oggetto SqlTransaction che rappresenta il contesto
della transazione• Utilizza connection pooling configurabile nella stringa di
connessione al database– Utilizza i Component Services come architettura di pooling– Da usare per migliorare la scalabilità– È abilitato per default ma può essere configurato
130
• Implementa l’interfaccia IDbCommand– ExecuteReader
• Da utilizzare quando è previsto un result set come ritorno– ExecuteScalar
• Da utilizzare per aggregazioni o risultati di calcoli• Ritorna solo la prima colonna della prima riga, gli altri dati
vengono persi– ExecuteNonQuery
• Ottimizzato per query che non ritornano result set ma solo parametri di ritorno o numero di record modificati
– ExecuteOracleNonQuery (in OracleCommand)• == ma ritorno rowid come parametro output
131
• Utilizzare la collezione Parameters per passare nella maniera migliore i parametri di input e output nelle chiamate
• I parametri sono nominali e non più posizionali– Occorre specificare correttamente il nome dei singoli
parametri– In OleDbCommand rimangono posizionali– In OracleCommand :nomepar
• Se eseguiamo una ExecuteReader e la stored procedure ritorna dati e parametri– Parametri accessibili solo alla chiusura del DataReader
132
• Fornisce funzionalità di accesso read-only e forward-only su uno stream di record ritornati dall’esecuzione di un comando sul database
• Viene creato a partire da un oggetto SqlCommand• Il metodo Read legge la prima riga e le successive nello
stream fino al termine– Ritorna false al termine del result set
• Un solo record alla volta in memoria– Aumenta performance e scalabilità delle applicazioni
• Implementa l’interfaccia IEnumerable e quindi è possibile utilizzarlo come fonte dati nel DataBinding (in automatico solo con Web Controls)
133
• Parametro output nel comando come REF Cursor• Eseguire il comando• Convertire il parametro in un tipo OracleRefCursor• Metodo GetDataReader sul tipo per ottenere
OracleDataReader• Usare OracleDataReader come un normale Data
Reader
134
• I Managed Provider implementano le classi necessarie alla connessione verso una fonte dati
• La classe DataAdapter funziona da bridge per alimentare la parte disconnessa
• Il DataSet è il componente che implementa le funzionalità di In-Memory database
• Le modifiche fatte ai dati disconnessi possono essere riportate sulla fonte dati utilizzando i comandi associati al DataAdapter– Solo il comando di Select è indispensabile– È possibile costruire gli altri utilizzando il CommandBuilder– Conviene costruire i propri comandi che chiamano Stored Procedure
per eseguire le modifiche
135
XmlXmlData SourceData Source
136
• L’oggetto DataSet rappresenta un contenitore di dati in memoria e contiene una serie di– Tabelle– Relazioni tra le tabelle– Vincoli di integrità dei dati
• L’utilizzo di tali oggetti è assolutamente simile nelle funzionalità ad un database relazionale
• È possibile salvare i dati contenuti in formato XML e i relativi metadati in XSD (Xml Schema Definition)
137
• Un DataSet è un in-memory database completamente indipendente
• Disconnesso da qualsiasi fonte dati• Contiene informazioni sui dati e sulla loro struttura (metadati)• Utilizza un accesso di tipo array based
– No navigazione tipo “MoveNext” ma diretto a righe e colonne
• È possibile associare uno schema XSD e “tipizzare” l’accesso alle informazioni– myDataSet.Customers(2).Name
• Dati rappresentati e serializzati in XML– Eredita da MarshalByValueObject e supporta ISerializable quindi può
essere serializzato durante operazioni di Remoting / Web Services
138
DataSet
DataTableCollectionDataRelationsCollection
DataRelation DataTable
.DataColumnCollectionDataRowCollectionConstraintCollection
DataColumnDataRowConstraint
DataTable DataTable
DataColumn DataRow
.ChildRelations
.ParentRelations .Select
.Tables.Relations
.Item .Item
.Item .Item.Item
.Constraints .Rows .Columns.ChildTable
.ChildColumns
.ParentTable
.ParentColumns
139
• Il DataSet non dipende dalla fonte dati utilizzata per popolarlo– È possibile utilizzare un oggetto di tipo DataAdapter per
popolare il DataSet– Il DataSet può essere popolato con informazioni
provenienti da differenti fonti dati• SQL Server, Oracle, File XML, ecc.
– Si può costruire la struttura via codice e utilizzarlo come data store senza nessun legame con una fonte dati
• Le DataTable utilizzano tipi di dati .NET, indipendenti dalla sorgente
140
• Rappresenta il contenitore delle informazioni in memoria
• Struttura descritta da una collection di DataColumn e da una di Constraint– Primary Key– UniqueConstraint– ForeignKeyConstraint
• Supporta la Cascading DRI attraverso le proprietà DeleteRule e UpdateRule (come Sql Server...)
• La proprietà AcceptRejectRule consente di propagare le modifiche fatte su una tabella “master” ad una o più “details”
141
Data
DataAdapter
Connection
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
DataSet
.Fill.Fill
.Updat.Updatee
CommandBuilder
142
• L’operazione di query e l’apertura della connessione verso la fonte dati viene eseguita alla chiamata del metodo Fill dell’oggetto DataAdapter– Accetta come parametri il DataSet da utilizzare e il nome
di una tabella o un oggetto DataTable da riempire– Se la tabella non esiste viene creata
• La connessione al database viene creata (se necessario), aperta e chiusa automaticamente al riempimento del DataSet
143
• Quando i dati arrivano al DataSet perdono ogni legame con la fonte dati
• È possibile recuperare lo schema dei dati che viene mantenuto in cache nel DataSet
• La rappresentazione interna di schema e dati è in formato XML
• È possibile alimentare il DataSet sia con dati relazionali che direttamente con documenti XML per dati e schema
144
• Il DataSet– Carica/salva nativamente dati in formato XML– Supporta il caricamento di schema in formato XSD– Uno Schema può essere dedotto dai dati XML
• Il DataSet può essere associato ad un XmlDataDocument– Eredita ed estende XmlDocument– Espone una vista relazionale/tabellare sui dati XML– Permette un utilizzo avanzato dei dati XML
• Fortemente tipizzato• Collegato a controlli UI
– Permette l’utilizzo degli strumenti XML su dati relazionali • Validazioni dello schema• Trasformazioni XSL/T• Query XPath
145
VS.NET Designers, Controls
XSLT, XPath, Validation
DataSetXMLDataDocument
XMLReader
XMLNodeReaderXMLTextReader
ManagedProvider
XML DocumentXML Stream
146
• Dedicato a dati in formato XML– Utilizzato con il metodo ExecuteXmlReader() dell’oggetto
SqlCommand– Valido solo per query con la clausola FOR XML
• Solo in Sql Server 2000– Accesso ai dati Xml in modalità “single node”, un solo
nodo in memoria– Performante per grandi quantità di informazioni rispetto
al DataSet
147
• Aggancio fra un elemento visivo e un dato– In modo dichiarativo– Molto semplice– Molto veloce– Molti datasource supportati– Tecnologia aperta anche per DB
• Automatizzata– Non come in VB (per fortuna)
• Più semplice agganciare codice ottimizzato per insert/update/delete
148
• Controlli che supportano la proprietà DataSource• Possono essere agganciati a oggetti che
supportano IEnumerable o ICollection– DataTable/DataView– DataReader
• I controlli supportano il metodo DataBind()– Che valuta il loro DataSource e popola il controllo– Invoca anche il metodo DataBind() di tutti i controlli
Children– Come per la Page
149
• DataSource = sorgente di dati• DataMember = interna alla sorgente• DataTextField = Valore da visualizzare• DataValueField = Valore “chiave”
150
• 20– ListBox– Array di elementi– Utilizzo stesso DataSource per più controlli
• 21– ListBox da Database
151
• Fornisce una rappresentazione tabellare dei dati• Formata da colonne, header e footer• Colonne autogenerabili• O esplicitamente dichiarate con BoundColumns• Visualizzazione personalizzabile• Occhio al VIEWSTATE
152
• EditCommandColumn visualizza link per– EditCommand, UpdateCommand, CancelCommand
• OnEditCommand per gestire l’evento di editing• La DataGrid mantiene la proprietà EditItemIndex
– Riga da editare– -1 se in modalità visualizzazione
• DataGridCommandEventArgs viene passato ai vari handler
• DataKeyField deve contenere la chiave primaria• Nell’handler UpdateCommand si usa DataKeyField
per accedere alla Primary Key da modificare
153
• DataGrid– Update
• OnUpdateCommand– Delete
• OnDeleteCommand• Provare Demo: occhio al DB (Constraint etc etc)
• Si può fare paginazione– Automatica da DataGrid...poco efficiente– Automatica da DataAdapter...poco efficiente– Manuale (leggere www.devleap.com Articoli - ADO.NET)
154
• Contenitore generico• Itera sui dati• Eseguendo il rendering dell’ItemTemplate per
ogni elemento della collezione DataSource• Utile per avere controllo completo sul rendering
dei dati
155
• Visualizza i dati in una lista• Utile per visualizzazioni a lista
– Il default è righe/colonne
• Simile alla DataGrid ma– Più semplice da usare– Più leggera e quindi veloce
• Richiede almeno un ItemTemplate• Ogni template ha un suo stile
– HeaderStyle– ItemStyle
156
• RepeatColumns = “x”• RepeatDirection = Horizontal/Vertical
157
• Si possono caricare i template a RunTime• Controllo.ItemTemplate =
Page.LoadTemplate(“xxx.ascx”)
• N.B. Negli esempi non è stata usata la gestione degli errori !– Implementarla sempre nelle applicazioni !!!
158
• DataReader– E’ nato per le estrazioni– Più veloce per estrazioni– Il web è stateless: toccata e fuga
• DataSet– Che ce ne facciamo ?
• Richiesta/Risposta : Fine delle trasmissioni• Perchè tenere l’oggetto in memoria per
aggiornamenti ?– Caching
159
• Può contenere più DataTable• Ogni Table recuperata eventualmente da fonti
dati distinte• Può contenere strutture che non arrivano da
database• Può contenere relazioni fra DataTable.• Un DataSet inoltre può essere interamente
rappresentato in XML• Un Reader non deve essere usato per remotizzare
le chiamate da macchine diverse
160
• Oggi abbiamo visto una introduzione a ASP.NET• Che fare adesso ?
– Andare in pensione – Security in ASP.NET
• Evento il 23 Marzo a Firenze (250 Euro) (http://devcon.devleap.con/oneday)
• Cap 2 libro ASP.NET Full contact (30 Euro)• 2 Articoli sul sito www.DevLeap.it
– ADO.NET• Webcast sul sito Microsoft di Silvano Coriani su ADO.NET• http://www.microsoft.com/italy/msdn/eventi/webcast/
passati.mspx– Architettura inside del prodotto
• Cap 1 libro ASP.NET Full Contact scaricabile grauitamente da www.devleap.it sezione libri)
161
• ASP.NET gestisce anche Web Service– Webcast sul sito Microsoft Italia
http://www.microsoft.com/italy/msdn/eventi/webcast/passati.mspx
– Libro Web Service Full Contact
• Ma io oggi non ho capito qualcosa– Dal 20 marzo a maggio webcast sulla migrazione– In pratica per 5 lunedì un ora e mezza con Roberto
Brunetti via Internet sulle tematiche affrontate oggi – http://www.microsoft.com/italy/msdn/eventi/webcast
162
• Non tralasciate il framework .NET– Webcast sul sito Microsoft Italia
http://www.microsoft.com/italy/msdn/eventi/webcast/passati.mspx
• Importante– Try/Catch– Garbage Collector– Interop (se avete componenti COM)– Security con Code Access Security
• Evento UGI.NET il 7 Aprile…– Architettura delle applicazioni– Application Block
• In generale– State attenti agli automatismi…comodi ma pericolosi
• In particolare nella versione 2.0• E’ importante sapere cosa succede prima di decidere di usarli• Ottimi in applicazioni “piccole”
163
Milano, 7 aprile 2005organizzato da UGIdotNET, primo usergroup sulla tecnologia.NET
Writing Secure Code Fabio Santini
Code Access Security Raffaele Rialdi
ASP .NET Security Raffaele Rialdi
Securing Web Services Pierre Greborio
“Non-Admin” Developing Fabio Santini
Per iscriversi www.microsoft.com/italy/msdn/
165
• Panoramica sulla nuova versione• Architettura• Building Block• Novità per
– Page– Application– Membership– Role Manager– Profile
166
ASP.NET Whidbey “Building Block” API
MembershipMembership Role ManagerRole Manager PersonalizationPersonalization
Site NavigationSite Navigation Database Caching
Database Caching
ManagementManagement
167
Providers
ASP.NET Whidbey “Building Block” API
MembershipMembership
Windows SQL Server Custom
Role ManagerRole Manager PersonalizationPersonalization
Site NavigationSite Navigation Database Caching
Database Caching
ManagementManagement
Provider Model Design Pattern
JET (Access)
168
ASP.NET Whidbey “Building Block” API
MembershipMembership Role ManagerRole Manager PersonalizationPersonalization
Site NavigationSite Navigation Database Caching
Database Caching
ManagementManagement
169
ASP.NET Whidbey “Building Block” API
MembershipMembership Role ManagerRole Manager PersonalizationPersonalization
Site NavigationSite Navigation Database Caching
Database Caching
ManagementManagement
Nuovo ASP.NET Whidbey “Page Framework”
Master PagesMaster Pages Themes/SkinsThemes/Skins Adaptive UIAdaptive UI
170
New ASP.NET Whidbey “Building Block” APIs
MembershipMembership Role ManagerRole Manager PersonalizationPersonalization
Site NavigationSite Navigation Database Caching
Database Caching
ManagementManagement
New ASP.NET Whidbey “Page Framework” Features
Master PagesMaster Pages Themes/SkinsThemes/Skins Adaptive UIAdaptive UI
Nuovi Controlli (Oltre 40)
SecuritySecurity Web PartsWeb PartsDataData NavigationNavigation
171
• Site.Master– Definisco contenuto generale– <asp:ContentPlaceHolder id=“Pippo” ... />
• @Page Master = Site.Master
– <asp:Content ContentPlaceHolderId=“Pippo”>• Contenuto della pagina
– </asp:Content>
172
• Directory Theme– MioTema1
• Label.Skin– Background Blu – Foreground Bianco
• TextBox.skin– Background Bianco – Foreground Verde
– MioTema2• Label.Skin• TextBox.Skin
• @Page Theme=“MioTema1”
173
• Cross-page Posting• Validation Group
– Blog di Cristian (http://ricciolo.aspitalia.com/)
• Url Rewriting• Site Counter• Precompilazione
– Blog di Cristian
• Recupero aspx da DB o altri store• Client script • Security per risorse non asp.net
174
• Membership– Interfaccia per gestione dati di login
• Non per i dati dell’Utente (Nome etc) -> Personalization– Layer per eliminare codice ripetivo– Indipendente dallo store
• Secure Credential Storage Services– Algoritmi di Hashing per le credenziali– Elimina codice ripetitivo
• Gestione utenti– Validazione Credenziali / “Who is online”– Question/Answer password – Reset / Retrieve password
175
Stored Procedures
Data Access Layer (DAL)
Business Logic Layer (BLL)
176
177
• Gestione User– Validate– Create, Delete, Update
• Finding/Getting User– Per Username / Email– Utenti online
• Gestione Password– Password reset– Question/Answer
178
Sezione connStrings
179
180
• Login UI Server Control– Supporta AutoFormat– Convertibile in Template
• Si integra con– Forms Authentication– Membership
• Proprietà configurabili– Display, es. back color, fore color– Behavior, es. Redirect
181
<asp:LoginName />• Visualizza il LoginName
– Stringa formattabile ‘Ciao {0}!”– Altrimenti visualizza User.Identity.Name
<asp:LoginStatus />• Indica
– Logged in: ‘Login’– Not Logged: ‘Logout’– Immagini o testo (HTML)
182
Security Services / Application Programming Interfaces
MembershipMembership Role ManagerRole Manager
Data Storage
SQL Server 7 / 2000 / Yukon
AuthorizationManager Jet (Access) User Defined
Provider Model Design Pattern
Provider Model Design Pattern
Default Data Providers Custom
Integrated Server Controls
<asp:Login />
<asp:Login />
<asp:LoginView />
<asp:LoginView />
<asp:PasswordRecovery />
<asp:PasswordRecovery />
<asp:LoginStatus />
<asp:LoginStatus />
<asp:LoginName />
<asp:LoginName />
<asp:CreateUser />
<asp:CreateUser />
<asp:ChangePassword />
<asp:ChangePassword />
183
• Accesso gestito da web.config
• Controllo da codice con IsUserInRole
<authorization><authorization>
<allow roles="Forum-<allow roles="Forum-Administrators" />Administrators" />
<deny users="*" /><deny users="*" />
</authorization></authorization>
User.IsUserInRole(usernameUser.IsUserInRole(username););
184
• Role Manager– Mappa gli utenti sui ruoli– Elimina il codice per fare tutto questo– Costruito sulla API Role di ASP.NET 1.X
• Non legato a Membership– Lavorano bene insieme, ma…– Role Manager può essere utilizzato da solo– …così come Membership…
185
Stored Procedures
Data Access Layer (DAL)
Business Logic Layer (BLL)
186
Stessa Logica
187
• Gestione Ruoli– Create, Delete, Update– IsUserInRole / RolesForUser
• Aggiunta/Rimozione– AddUser[s]ToRole– AddUser[s]ToRole[s]
• Ricerca User-to-role– GetRolesForUser– GetUsersInRole
188
• Varia la visualizzazione– Anonymous– Logged– Appartenenza a ruoli
• Basato su Template– <loggedintemplate />– <anonymoustemplate />– <rolegroups />
190
EmailEmail
Time zoneTime zone
Date FormatDate Format
UsernameUsername
Extended Extended PropertiesProperties
191
• Memorizza le informazioni per ogni utente• Astrazione rispetto allo store• Elimina codice ripetitivo• Utente e Dati
– Informazioni sull’utente– Personalizzazione del contenuto
• SQL Server (o altro) back-end
192
• Type-Safe e Strongly-Typed– Non basato su Dictionary– Nessun Cast richiesto– Proprietà esposte e “rintracciabili”
• Recupero dei dati Smart– On-demand Data Retrieval
• Accesso allo store solo quando utilizzato– Dati Partizionabili
• Basato su Provider Model– Altri store pluggable– Estendibile con altre funzionalità
193
194
• Definisce una Proprietà dell’utente– Name obbligatorio– Defaults System.String– Default allowAnonymous = false
• Attributi
name Nome proprietà
readOnly Solo lettura ?
serializeAs Come si serializzano i dati
provider Provider utilizzato
defaultValue Valore di Default
type .NET Data type
allowAnonymous Proprietà valida anche per accessi anonimi
196
– SQL 7 e SQL 2000• Table Change Dependency
– No Row-Level• Richiesto Setup • Polling Model• Trigger (su Table) + SP (Check)
– SQL Server 2005• Result Set Dependency• Supportato da SqlCommand• Nessun Setup• Notification Model
197
default.aspxweb.config
198
N n1
data a
ASP.NETASP.NET SQL ServerSQL ServerNorthwind DatabaseNorthwind Database
tableName
changeIdChangeNotification tableChangeNotification table
Products tableProducts table
triggertrigger
productsproducts 11
SqlCacheDependencySqlCacheDependency
33
zz
aspnet_regsqlcache.exeaspnet_regsqlcache.exe
PagePage
DataSetDataSet
CacheCache
199
• Notifiche più granulari– Es “Modifica dati in una tabella”– Es “quando il resutset di una SP cambia”
• Sfrutta caratteristiche Yukon– Nessun Trigger o servizi da installare– Invio Modifiche ai subscriber
• ADO.NET SqlCommand – Supportato solo da Yukon– bool NotificationAutoEnlist
200
ASP.NETASP.NET SQL Server ‘Yukon’SQL Server ‘Yukon’
IISIIS
Northwind
HttpListenerHttpListener
Http.sysHttp.sys Notification Delivery ServiceNotification Delivery ServiceTCP Port 80
SqlCommandSqlCommandSqlCommandSqlCommand
SqlCacheDependencySqlCacheDependency
PagePage
DataSetDataSet
CacheCacheChange Change
DetectionDetection
201
• www.aspitalia.com• www.devleap.com• www.ugidotnet.org• www.visual-basic.it• www.asp.net
202
• Di tutto– Della partecipazione– Delle domande
• Ci sentiamo per posta o nei blog– [email protected]– http://Blogs.DevLeap.com/rob– http://Blogs.DevLeap.com
• Ci vediamo alla prossima– Magari il 23 marzo a Firenze per ASP.NET Security
203