BENVENUTI
10.00
Inizio
12.30
Lunch
14.00
Ripresa lavori
15.15
Coffee Break
18.45
Termine
2
Cenni di licensing
•
•
•
•
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)
4
Per tutti gli strumenti di sviluppo
la Software Assurance è MSDN
5
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++)
•Diminuito il prezzo della versione full da 1.347€ a 992€
•Nuova opzione di aggiornamento: versione Upgrade per i possessori
dei tool standard della famiglia VS.NET 2002 e 2003.
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
6
Diverse versioni: Library, Operating System,
Professional, Enterprise, Universal
Documentazione 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 Systems
MSDN Professional
MSDN Enterprise
MSDN Universal
2 incidents
2 incidents
3 incidents
4 incidents
Ricordarsi di attivare la licenza via Web dal sito MSDN!
7
•KIT MSDN Universal…e diventi MCP! 5.143 € 3.182 €
MSDN Universal
3.353€ 3.182€
•Corso MOC 2310
•Voucher esame 1.550€
•Libro MOC
Programming
Microsoft ASP.NET
•KIT MSDN Professional 1.511 € 1.332 €
MSDN Professional
1.481€ 1.332€
Introducing
Microsoft ASP.NET 2.0
8
• Hai una licenza Visual Studio .NET?
E’ il momento di passare a MSDN: paghi solo la Software
Assurance!
9
•
Per tutte le informazioni sui nostri eventi e webcast visitate
www.microsoft.com/italy/msdn/
registratevi direttamente alla Newsletter MSDN Flash.
10
MCSD MCAD MCSE+I MCSA MCT
• 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
12
• 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
13
Server
Client
IIS/Apache
Richiesta HTTP
default.htm
Risposta HTTP
Browser
ActiveX VBScript DHTML
Controls
JavaScript Java
Applets
CSS
2.0
XML
Internet Explorer
5.x 6.x
Internet Explorer
4.x
Netscape Navigator
4.x
Netscape Navigator
3.x
Microsoft WebTV
15
Server
Client
IIS
http://www.dcc.com/equipment/catalog_type.asp?
ProductType=rock+shoes
Richiesta HTTP
Active Server Pages
engine
Risposta HTTP
Esecuzione
JScript
VB
/ C#
ADO.NET
Recupero risultati
default.aspx
• Time
• For i = 1 to X
– Response
• Next
17
• <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
18
• Contiene le info del QueryString
<% first=Request.QueryString("txtfname")%>
<% first=Request.QueryString(“txtfname”)
last =Request.QueryString(“txtlname”)
Response.Write(“Welcome” & first & last)%>
19
• <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)
20
• Contiene le info del Form
<% first=Request.Form("txtNome")%>
<% first=Request.Form(“txtNome”)
last =Request.Form(“txtCognome”)
Response.Write(“Ciao” & first & last)%>
21
• 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
22
• Ripresentare le informazioni digitate
• <INPUT
•
TYPE=“TEXT”
•
NAME=“txtNome”
VALUE=<%=Request.QueryString(“txtNome”)%>
• >
23
• <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
24
• Recupero valori digitati in automatico
• Poi aggiungiamo il codice per contare
25
•
•
•
•
•
Oggetti programmabili
Attributo runat=“server”
Mantengono lo stato delle info
Generano HTML per il client
Espongono
– Proprietà
– Metodi
• Scatenano eventi
26
• <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")
27
• <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
28
• 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>
29
• 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
30
• 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è ?
31
• 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à
32
• <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
33
34
• <asp:TextBox ...
– Strongly-typed
– BackColor=“red”
• <asp:ListBox ...
– Mantenere lo stato significa anche riposizionare la combo-box
– Si possono aggiungere elementi
– Reflector (listbox.rendercontents)
35
• 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
36
• 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
37
•
•
•
•
•
•
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
38
Parsing
Request
ASPX
File
Request
Response
Response
Generazione Codebehind
Engine
file
ASPX
Creazione
Istanza
Class
File
su
Disco
Page
Class
Istanza,
Esecuzione
e Rendering
• 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#; 
40
ElencoCorsi.aspx
<%@Page Language=“VB” Explicit=“True” %>
<%@Assembly name=“GestioneCorsi” %>
<%@Import namespace=“Corsi” %>
Codice VB (uno solo per pagina)
Dichiarazione variabili
obbligatoria (abilitare sempre)
---codice--Referenzia l’Assembly
GestioneCorsi.dll
Queste direttive corrispondono a
Vbc.exe /optionexplicit+ /r:GestioneCorsi.dll ElencoCorsi_aspx
41
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
42
• Page Events
–
–
–
–
Page_Init
Page_Load
Page_Unload
La routine di evento riceve gli argomenti .NET
43
• Evento Load
• Riempire una ListBox
• Occhio al POST
– Aggiunge sempre elementi
– Perchè la listbox mantiene il suo stato
44
• If Request.ServerVariables(“HTTP_METHOD”) diventa
• If Page.IsPostBack
– Proprietà della classe Page
– True se POST
– False se GET
45
• Evento Load
• Riempire una ListBox solo in Get
• I controlli mantengono lo stato
46
• 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
User
Inserimento
Msg
Errore
Valido?
Client
Server
No
Si
Valido?
No
Si
Web Application
Processing
47
• 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
48
• 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
49
• 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
50
• 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 !!!
51
• Ci svela molti segreti
• Espone
– Proprietà
• Request / Response
– Metodi
• DataBind
• OnInit
• OnLoad
– Eventi
• Init / Load / UnLoad
– ...
52
• 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
53
• 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(...)
54
• Separare il layout dal codice
• Uno solo per pagina
• @Page
CodeBehind=“Codice.vb/cs”
Inherits=“Classe”
55
• Il Code Behind non è un’appendice della pagina ma la
classe da cui viene ereditata la pagina
56
.dll
System.Web.UI.Page
public
public
public
public
Event EventHandler Load
bool IsPostBack {get;}
HttpRequest {get;}
HttpResponse {get;}
.VB
Public Class Codice
Inherits S.W.U.Page
Public txtName as S.W.U.TextBox
Sub Page_Load(x,y)
Response.Write “x”
End Sub
La classe contiene le interfacce
della classe base + txtName
.aspx
@Page Inherits=“Codice”
<asp:TextBox Id=“txtName” />
La pagina eredita la Classe Codice
Quindi le nuove proprietà, eventi
e metodi rispetto a Page
57
• 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
58
• Application_Start
– Creo counter nel performance monitor
– DevLeap / Richieste Totali
• Application_BeginRequest
– Sommo 1 al contatore
59
• 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
60
• 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
61
• Può contenere costanti applicative
– Connection String
– Indirizzo Email WebMaster
• <appSettings>
• <add key=“EMail” value=“[email protected]” />
– </appSettings>
• Nel codice
– strConn = Configuration.AppSettings(“EMail”)
62
• “Semplice”
• <configuration>
•
<system.web>
•
<customErrors mode=“remoteonly”
defaultRedirect=“error.htm”/>
•
</system.web>
• </configuration>
63
• “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>
64
• 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
65
HTTP Request
.ASPX
.ASMX
.ASHX
.DISCO
.SOAP
ISAPI
Extension
Manager
• ASP.NET non usa ISAPI/ASP per
eseguire il codice
• ISAPI Extension ASPNET_ISAPI.DLL
redirige le richieste sul worker process di
ASP.NET
ASP.DLL
ASPNET_ISAPI.DLL
INETINFO.exe
ASP.NET
Pipeline
ASP.NET
Worker Process
67
ASP.NET worker thread 1
HttpRuntime
Class
Modulo 1
Modulo 2
PageHandler
Pagina1.aspx
ASP.NET worker thread 2
HttpRuntime
Class
Modulo 1
Modulo 2
PageHandler
Pagina2.aspx
ASPNET_WP.EXE
68
ASP.NET worker thread 1
HttpRuntime
Class
Authent
Authoriz
PageHandler
Pagina1.aspx
ASP.NET worker thread 2
HttpRuntime
Class
Authent
PageHandler
Pagina2.aspx
ASPNET_WP.EXE
69
• <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"/>
70
• </httpModules>
• Gestore della risorsa
• Ogni estensione viene legata ad un HttpHandler
• Come in Windows: ogni estensione è legata ad un
programma
• Esistono diversi HttpHandler di default
71
•
•
•
•
•
•
•
•
•
<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"/>
72
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
<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>
73
• Il Web è stateless
• Mantenere lo stato delle informazioni
– Valori
– Variabili
– Proprietà
• Server-Side per riutilizzarli fra richieste diverse
• Sulla stessa pagina
• Sull’intera applicazione
75
• Server Side
–
–
–
–
Web.Config
Application
Session (se cookie andrebbe dopo)
Caching
• Client/Server Side
–
–
–
–
Cookie
Hidden Field
QueryString
ViewState
76
• 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
77
• In ASP 1/2/3 le session
– Necessitano del supporto dei cookie sul client
– Sono single-machine e non adatte a configurazioni in loadbalancing
– 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
78
• 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
79
Browser
Browser
Cookie
Server
Session
URL Sess
Cookie
Session
URL Sess
ASP.NET worker thread 1
HttpRuntime
Class
Modulo X
Session
HTTP Handler
Pagina1.aspx
ASP.NET worker thread 2
HttpRuntime
Class
Modulo X
Session
ASPNET_WP.EXE
HTTP Handler
Pagina2.aspx
80
• 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
81
• <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
82
• <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
83
ASPNET_WP
Browser
Browser
Cookie
URL Sess
Session
Cookie
Session
URL Sess
<sessionState mode=“InProc” cookieless="true|false" />
• Più veloce
• Singolo Server – No Load Balancing
• Se ASPNET_WP crasha – Addio Session
84
Browser
Browser
Cookie
URL Sess
Cookie
URL Sess
ASPNET_WP
ASPNET_STATE
SERVER 3
SERVER 1
Session
Session
Browser
Cookie
URL Sess
ASPNET_WP
SERVER 2
Session
<sessionState mode=“StateServer” cookieless="true|false"
stateConnectionString="tcpip=server3:42424" />
• ASPNET_STATE Può girare anche sullo stesso server
• Se ASPNET_WP crasha – Le Session sopravvivono
• Più lento di InProcess – Più veloce di SQL Server Session
• Load Balancing
• Se crasha ASPNET_STATE – Addio Sessioni di tutti i server
85
Browser
Browser
Browser
Cookie
URL Sess
Cookie
URL Sess
Cookie
URL Sess
ASPNET_WP
Sql Server
o
Sql Cluster
SERVER 1
Session
ASPNET_WP
SERVER 2
Session
Session
<sessionState mode=“SQLServer” cookieless="true|false"
sqlConnectionString=“ConnString” />
• SQL può girare anche sullo stesso server
• Se ASPNET_WP crasha – Le Session sopravvivono
• Metodo più lento ma più sicuro (se in cluster)
• Load Balancing
86
• %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
87
1400
Requests/Sec (2P Server)
1200
1000
800
600
400
200
0
ASP.NET InProc
ASP.NET State Store ASP.NET SQL Store
88
• 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”
89
•
•
•
•
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
90
• 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
92
• Implementato da
System.Web.Caching.OutputCacheModule
Cache
ASP.NET worker thread 1
HttpRuntime
Class
OutputCache
Session
HTTP Handler
Pagina1.aspx
ASP.NET worker thread 2
HttpRuntime
Class
OutputCache
ASPNET_WP.EXE
HTTP Handler
Pagina2.aspx
93
• 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))
94
• 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’
95
• 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
97
• Cache.Add o Cache.Insert
• (
Nome,
Valore,
Dependency,
Time,
TimeSpan,
Priority,
CallBack
• )
98
•
•
•
•
None
Windows (default)
Forms
Passport
• Si impostano nel web.config
100
•
•
•
•
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#
101
• 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
102
• 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
103
• <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
104
• 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)
105
• 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
106
• 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
107
• <configuration>
<system.web>
<authorization>
<deny users=“?” />
<allow users=“Dominio\Utente” />
<allow roles=“Dominio\Gruppo” />
<deny users=“*” />
</authorization>
<system.web>
• </configuration>
108
•
•
•
•
•
ASP Vs. ASP .NET
Debug.Assert ((VB.NET <> VB6) And (VB.NET<>VBScript))
<% …%>
COM o non COM, questo è il dilemma…
Demo Ugrade
110
• 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
111
• 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 
112
•
•
•
•
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
113
• 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()
%>
114
• 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()
%>
115
• 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
116
• 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
117
• 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
118
• demo
119
• 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
120
• demo
121
• 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
123
.NET Application
DataSet
Other
System.Data.SqlClient
System.Data.OleDb
System.Data.Odbc
OLE DB
OLE DB Provider
TDS
Other DS
SQL Server
ODBC
Other DBMS
Non-relational
sources
124
• 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
125
• 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
126
• È 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
127
SqlConnection
.CreateCommand
SqlCommand
.ExecuteXmlReader
.Connection
.ExecuteReader
.Parameters
System.Xml.XmlReader
SqlDataReader
.Item
Object
.SqlParameterCollection
.CreateParameter
.Add
.Item
.SqlParameter
128
• 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
129
• 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
130
• 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
131
• 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
132
solo con Web Controls)
•
•
•
•
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
133
• 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
134
– Conviene costruire i propri comandi che chiamano Stored Procedure
per eseguire le modifiche
Data Source
Xml
135
• 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)
136
• 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
137
DataSet
.Relations
.Tables
DataRelationsCollection
DataTableCollection
.Item
.Item
.ChildRelations
DataRelation
.ParentRelations
DataTable
.Select
.ParentTable .ChildTable
.Constraints
DataTable
DataTable
.ParentColumns .ChildColumns
DataColumn
DataRow
ConstraintCollection
.Item
Constraint
.Rows
DataRowCollection
.Item
DataRow
.Columns
.DataColumnCollection
.Item
DataColumn
138
• 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
139
• 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”
140
Select
Command
CommandBuilder
DataAdapter
Insert
Command
Connection
.Fill
.Update
Update
Command
Delete
Command
DataSet
Data
141
• 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
142
• 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
143
• 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
144
XSLT, XPath, Validation
VS.NET
Designers, Controls
XMLDataDocument
DataSet
Managed
Provider
XMLReader
XML Stream
XMLTextReader
XMLNodeReader
XML Document
145
• 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
146
• 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
147
• 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
148
•
•
•
•
DataSource = sorgente di dati
DataMember = interna alla sorgente
DataTextField = Valore da visualizzare
DataValueField = Valore “chiave”
149
• 20
– ListBox
– Array di elementi
– Utilizzo stesso DataSource per più controlli
• 21
– ListBox da Database
150
•
•
•
•
•
•
Fornisce una rappresentazione tabellare dei dati
Formata da colonne, header e footer
Colonne autogenerabili
O esplicitamente dichiarate con BoundColumns
Visualizzazione personalizzabile
Occhio al VIEWSTATE
151
• 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
152
• 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)
153
• 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
154
• 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
155
• RepeatColumns = “x”
• RepeatDirection = Horizontal/Vertical
156
• 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 !!!
157
• 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
158
•
•
•
•
•
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
159
• 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)
160
• 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
161
• 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”
162
Milano, 7 aprile 2005
organizzato 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/
163
•
•
•
•
Panoramica sulla nuova versione
Architettura
Building Block
Novità per
–
–
–
–
–
Page
Application
Membership
Role Manager
Profile
165
ASP.NET Whidbey “Building Block” API
Membership
Role Manager
Personalization
Site Navigation
Database Caching
Management
166
ASP.NET Whidbey “Building Block” API
Membership
Role Manager
Personalization
Site Navigation
Database Caching
Management
Provider Model Design Pattern
Providers
Windows
SQL Server
JET (Access)
Custom
167
ASP.NET Whidbey “Building Block” API
Membership
Role Manager
Personalization
Site Navigation
Database Caching
Management
168
Nuovo ASP.NET Whidbey “Page Framework”
Master Pages
Themes/Skins
Adaptive UI
ASP.NET Whidbey “Building Block” API
Membership
Role Manager
Personalization
Site Navigation
Database Caching
Management
169
Nuovi Controlli (Oltre 40)
Security
Data
Navigation
Web Parts
New ASP.NET Whidbey “Page Framework” Features
Master Pages
Themes/Skins
Adaptive UI
New ASP.NET Whidbey “Building Block” APIs
Membership
Role Manager
Personalization
Site Navigation
Database Caching
Management
170
• Site.Master
– Definisco contenuto generale
– <asp:ContentPlaceHolder id=“Pippo” ... />
• @Page Master = Site.Master
– <asp:Content ContentPlaceHolderId=“Pippo”>
• Contenuto della pagina
– </asp:Content>
171
• Directory Theme
– MioTema1
• Label.Skin
– Background Blu – Foreground Bianco
• TextBox.skin
– Background Bianco – Foreground Verde
– MioTema2
• Label.Skin
• TextBox.Skin
• @Page Theme=“MioTema1”
172
• 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
173
• 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
174
Stored Procedures
Data Access Layer (DAL)
Business Logic Layer (BLL)
175
176
• Gestione User
– Validate
– Create, Delete, Update
• Finding/Getting User
– Per Username / Email
– Utenti online
• Gestione Password
– Password reset
– Question/Answer
177
Sezione connStrings
178
179
• 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
180
<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)
181
Integrated Server Controls
<asp:LoginView />
<asp:Login />
<asp:PasswordRecovery />
<asp:LoginStatus />
<asp:ChangePassword />
<asp:LoginName />
<asp:CreateUser />
Security Services / Application Programming Interfaces
Membership
Role Manager
Provider Model Design Pattern
Provider Model Design Pattern
Data Storage
Authorization
Jet (Access)
Default Data
ManagerProviders
SQL Server 7 /
2000 / Yukon
User Defined
Custom
182
• Accesso gestito da web.config
<authorization>
<allow roles="Forum-Administrators" />
<deny users="*" />
</authorization>
• Controllo da codice con IsUserInRole
User.IsUserInRole(username);
183
• 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…
184
Stored Procedures
Data Access Layer (DAL)
Business Logic Layer (BLL)
185
Stessa Logica
186
• Gestione Ruoli
– Create, Delete, Update
– IsUserInRole / RolesForUser
• Aggiunta/Rimozione
– AddUser[s]ToRole
– AddUser[s]ToRole[s]
• Ricerca User-to-role
– GetRolesForUser
– GetUsersInRole
187
• Varia la visualizzazione
– Anonymous
– Logged
– Appartenenza a ruoli
• Basato su Template
– <loggedintemplate />
– <anonymoustemplate />
– <rolegroups />
188
Username
Email
Time zone
Date Format
Extended
Properties
190
•
•
•
•
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
191
• 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à
192
193
• Definisce una Proprietà dell’utente
– Name obbligatorio
– Defaults System.String
– Default allowAnonymous = false
• Attributi
name
readOnly
Nome proprietà
Solo lettura ?
serializeAs
provider
defaultValue
Come si serializzano i dati
Provider utilizzato
Valore di Default
type
allowAnonymous
.NET Data type
Proprietà valida anche per accessi
194
anonimi
– 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
196
default.aspx
web.config
197
ASP.NET
Cache
SQL Server
Northwind Database
SqlCacheDependency
Products table
z
Page
trigger
DataSet
N
n1
data a
ChangeNotification table
tableNam
e
aspnet_regsqlcache.exe
products
changeId
3
1
198
• 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
199
ASP.NET
SQL Server ‘Yukon’
SqlCommand
Northwind
Cache
SqlCacheDependency
Change
Detection
Page
DataSet
HttpListener
IIS
Http.sys
TCP Port 80
Notification Delivery Service
200
•
•
•
•
•
www.aspitalia.com
www.devleap.com
www.ugidotnet.org
www.visual-basic.it
www.asp.net
201
• 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
202
203
Scarica

BENVENUTI - Microsoft