ASPNETU pgrade Tour by jaPceNp

VIEWS: 0 PAGES: 203

									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    Standard                659-01570             € 992
  2003 Special Edition


  Visual Studio .NET Professional    Upgrade*                659-01579             € 676
  2003 Special Edition                                                                 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      2 incidents
      MSDN Professional              2 incidents
      MSDN Enterprise                3 incidents
      MSDN Universal                 4 incidents
                                                             7
Ricordarsi di attivare la licenza via Web dal sito MSDN!
•KIT MSDN Universal…e diventi MCP! 5.143 € 3.182 €
                    •Corso MOC 2310              Programming
  MSDN Universal
                    •Voucher esame 1.550€      Microsoft ASP.NET
  3.353€ 3.182€
                    •Libro MOC




 •KIT MSDN Professional 1.511 € 1.332 €
            MSDN Professional           Introducing
             1.481€ 1.332€         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
Client                      Server
                          IIS/Apache
         Richiesta HTTP

                            default.htm

         Risposta HTTP
 Browser             ActiveX VBScript DHTML   JavaScript Java      CSS   XML
                     Controls                            Applets   2.0


Internet Explorer
5.x 6.x

Internet Explorer
4.x

Netscape Navigator
4.x

Netscape Navigator
3.x


Microsoft WebTV


                                                                               15
                  Client                                                     Server

http://www.dcc.com/equipment/catalog_type.asp?
                                                                               IIS
ProductType=rock+shoes

                                                 Richiesta HTTP
                                                                    Active Server Pages
                                                                           engine
                                                 Risposta HTTP           Esecuzione    JScript
                                                                                       VB / C#




                                                                        ADO.NET
                                                                                       default.aspx
                                                                  Recupero risultati
• 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
                          ASPX  Generazione Code-
               Parsing
                                            behind
                         Engine               file


Request      ASPX                         Class
              File       Creazione         File
Request                   Istanza          su
                                          Disco


      Response            Page
          Response        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” %>


                                                  Codice VB (uno solo per pagina)
<%@Assembly name=“GestioneCorsi” %>
                                                  Dichiarazione variabili
<%@Import namespace=“Corsi” %>
                                                  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
                                                 User
  e server-side
                                              Inserimento        Msg
• Client-side Validation                                         Errore
   – Dependent on browser version
   – FeedBack immediato                          Valido?
                                                            No
   – Riduce i round-trip
                                        Client       Si
• Server-side Validation
                                        Server
   – Riesegue le validazioni
                                                 Valido?
   – Controllo su fonte dati                                No
                                                     Si

                                             Web Application
                                                                 47
                                              Processing
• 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
                               public   Event EventHandler Load
        System.Web.UI.Page     public   bool IsPostBack {get;}
                               public   HttpRequest {get;}
                               public   HttpResponse {get;}
.VB
                               Public txtName as S.W.U.TextBox
                               Sub Page_Load(x,y)
                                         Response.Write “x”
         Public Class Codice   End Sub
        Inherits S.W.U.Page    La classe contiene le interfacce
                               della classe base + txtName
.aspx
                               <asp:TextBox Id=“txtName” />
                               La pagina eredita la Classe Codice
                               Quindi le nuove proprietà, eventi
  @Page Inherits=“Codice”      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=“Roberto@DevLeap.it” />
   – </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      • ASP.NET non usa ISAPI/ASP per
.ASPX             eseguire il codice
.ASMX             • ISAPI Extension ASPNET_ISAPI.DLL
.ASHX             redirige le richieste sul worker process di
.DISCO            ASP.NET
.SOAP




  ISAPI
                                                 ASP.NET
Extension          ASP.DLL
               ASPNET_ISAPI.DLL
                                                 Pipeline
 Manager


                                                 ASP.NET
   INETINFO.exe                                Worker Process
                                                            67
              ASP.NET worker thread 1
HttpRuntime                             PageHandler
               Modulo 1     Modulo 2
    Class                               Pagina1.aspx


              ASP.NET worker thread 2
HttpRuntime                             PageHandler
              Modulo 1     Modulo 2
    Class                               Pagina2.aspx



              ASPNET_WP.EXE

                                                   68
              ASP.NET worker thread 1
HttpRuntime                             PageHandler
               Authent      Authoriz
    Class                               Pagina1.aspx


              ASP.NET worker thread 2
HttpRuntime                             PageHandler
               Authent
    Class                               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 load-
     balancing
   – Consumano molta RAM
• In ASP.NET le session
   –   Possono lavorare come prima oppure
   –   Non necessitare dei cookie
   –   Essere multi-machine
   –   Appoggiarsi su DB o su uno State Server


                                                                  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
                                           Server
                            Cookie
              Browser                           Session
                           URL Sess
                           Cookie
              Browser                           Session
                           URL Sess


                    ASP.NET worker thread 1
HttpRuntime                                               HTTP Handler
                        Modulo X      Session
    Class                                                 Pagina1.aspx



                    ASP.NET worker thread 2
HttpRuntime                                               HTTP Handler
                    Modulo X          Session
    Class                                                 Pagina2.aspx


                                                                     80
                   ASPNET_WP.EXE
• 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

               Cookie
Browser                        Session
               URL Sess



               Cookie
Browser                        Session
               URL Sess



<sessionState mode=“InProc” cookieless="true|false" />
• Più veloce
• Singolo Server – No Load Balancing
• Se ASPNET_WP crasha – Addio Session                    84
                Cookie          ASPNET_WP                     ASPNET_STATE
 Browser
                URL Sess
                                                                SERVER 3
                                  SERVER 1
                Cookie                                             Session
 Browser        URL Sess
                                                                   Session
                Cookie          ASPNET_WP
 Browser                                                           Session
                URL Sess         SERVER 2


<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                                                             85
• Se crasha ASPNET_STATE – Addio Sessioni di tutti i server
                                                         Sql Server
                Cookie          ASPNET_WP                     o
 Browser
                URL Sess                                 Sql Cluster
                                  SERVER 1
                Cookie
 Browser        URL Sess
                                                              Session

                Cookie          ASPNET_WP                     Session
 Browser
                URL Sess         SERVER 2
                                                              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

                           1200
Requests/Sec (2P Server)




                           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       89
      • @Page EnableSessionState=“readonly”
•   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                               HTTP Handler
                 OutputCache     Session
      Class                                 Pagina1.aspx



                  ASP.NET worker thread 2
  HttpRuntime                               HTTP Handler
                 OutputCache
      Class                                 Pagina2.aspx



                 ASPNET_WP.EXE                         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>

<%                                      <script language="VB" runat=server>
  Sub DoSomething()                       Sub DoSomething()
    Response.Write “Ciao a tutti !!!"        Response.Write (“Ciao a tutti !!!")
  End Sub                                 End Sub
                                        </script>
 DoSomething                            <%
%>                                        DoSomething()
                                        %>



                                                                                   114
   • ASP.NET non supporta le funzioni di rendering di pagina
<% Sub RenderSomething() %>                            <script language="VB" runat=server>
   <font color="red"> Sono le ore: <%=Now %> </font>
<% End Sub %>                                            Sub RenderSomething()
                                                          Response.Write("<font color=red> ")
<%                                                        Response.Write(“Sono le ore: " & Now)
 RenderSomething                                         End Sub
 RenderSomething
%>                                                     </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




                                  ODBC


                                                         Non-relational
Other DS    SQL Server            Other DBMS               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          .ExecuteReader                         .Connection

                                                                    .Parameters




System.Xml.XmlReader           SqlDataReader                           .SqlParameterCollection
                                                                                                 .Add
                                     .Item             .CreateParameter           .Item


                                  Object                                   .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
  solo con Web Controls)                                     132
• 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
   – Conviene costruire i propri comandi che chiamano Stored         134
     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      137
     Services
                                              DataSet

                                            .Relations       .Tables



     DataRelationsCollection                                       DataTableCollection

                  .Item                                                      .Item

                                              .ChildRelations
            DataRelation                                               DataTable         .Select
                                              .ParentRelations
   .ParentTable .ChildTable
                                                .Constraints                .Rows           .Columns

DataTable                 DataTable   ConstraintCollection         DataRowCollection       .DataColumnCollection

.ParentColumns .ChildColumns                    .Item                        .Item                      .Item



DataColumn                 DataRow        Constraint                    DataRow                    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
                            Command
                .Update

                             Delete
                            Command
                                            Data
          DataSet



                                                        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
                                                   VS.NET
        XSLT, XPath, Validation
                                              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
                                                                     174
    – Reset / Retrieve password
    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:PasswordRecovery />      <asp:ChangePassword />

 <asp:Login />     <asp:LoginStatus />   <asp:LoginName />     <asp:CreateUser />




Security Services / Application Programming Interfaces

                 Membership                          Role Manager
     Provider Model Design Pattern           Provider Model Design Pattern



Data Storage


      Default Data Providers
    SQL Server 7 /
               Authorization
     2000 / YukonManager
                             Jet (Access)                      Custom
                                                               User Defined
                                                                              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
                         Extended
           Date Format   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                     Nome proprietà
    readOnly                 Solo lettura ?
    serializeAs              Come si serializzano i dati
    provider                 Provider utilizzato
    defaultValue             Valore di Default
    type                     .NET Data type
    allowAnonymous           Proprietà valida anche per accessi
                             anonimi                          194
– 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                  SQL Server
 Cache                    Northwind Database

                            Products table
   SqlCacheDependency


           Page                       z
                                                      trigger
          DataSet

                            N         n1

                            data a
                           ChangeNotification table
                           tableNam        changeId
                           e
                            products         3
                                             1
aspnet_regsqlcache.exe
                                                                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    Change
Cache
                                            Detection
  SqlCacheDependency


            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
   – Roberto@DevLeap.it
   – 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

								
To top