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