ASP NET.pdf

29
Applications ASP.NET avec VB.NET Gérard Frantz © Groupe Eyrolles, 2003, ISBN : 2-212-11280-7

Transcript of ASP NET.pdf

  • Applications ASP.NETavec VB.NET

    Grard Frantz

    Groupe Eyrolles, 2003,

    ISBN : 2-212-11280-7

  • 221

    C h a p i t r e 7

    Gestion de l'tat, lasession, les cookies

    D A N S C E C H A P I T R E

    Mise en vidence du problme

    Stockage des donnes sur le client

    Stockage des donnes sur le serveur

    Dans les chapitres prcdents, nous avons essentiellement considr les pages de faon indivi-duelle. Chacune d'elle effectuait un travail spcifique, les seules relations entre une page et uneautre tant un appel avec un hyperlien.

    Nous avons galement vu comment traiter les donnes d'une page dans des formulaires. AvecASP.NET, le code qui procde l'affichage initial de la page et celui qui traite les donnes saisiespar l'utilisateur se trouvent dans la mme page.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    222

    Nous n'avons cependant pas encore examin comment effectuer un traitement sur plusieurspages et particulirement comment retrouver dans le code associ une page les donnes d'uneautre page.

    Comme cela a t indiqu dans les chapitres prcdents, le Web est par essence un systmesans tat : l'utilisateur demande une page, celle-ci est renvoye par le serveur, puis tout estoubli ! Lors de la prochaine demande de l'utilisateur, le serveur ne se rappellera de rien.En d'autres termes, le serveur ne fait que rpondre des demandes ponctuelles de l'utilisateur,une par une, sans aucune connexion entre elles.

    Cette situation peut vous sembler dsespre, mais heureusement l'infrastructure .NET ajoutetout un ensemble de traitements spcifiques sur cette mcanique relativement primitive, afin devous aider construire de vritables applications Web. Certains de ces mcanismes sont auto-matiques, d'autres doivent tre programms explicitement.

    On peut distinguer plusieurs situations et systmes pour grer l'tat, c'est--dire faire passer lavaleur de donnes d'une page une autre. Les quatre premires techniques se servent du clientpour stocker les donnes :

    Utiliser le ViewState, l'tat d'affichage des pages Web mis en uvre dans des sacs d'tat(state bags).

    Utiliser des champs cachs.

    Passer les donnes par l'URL.

    Placer les donnes dans des cookies sur le poste de l'utilisateur.

    Les techniques suivantes stockent les donnes sur le serveur :

    Stocker les donnes dans des variables de session.

    Faire de mme avec des variables d'application.

    Utiliser le contexte.

    Placer les donnes dans le cache.

    La gestion de l'tat concerne deux catgories de donnes :

    Les valeurs des variables de l'application, principalement les variables de la classe asso-cie la page.

    Les valeurs des proprits des contrles de la page.

  • Applications ASP.NET avec VB.NET

    223

    Mise en vidence du problmePrenons un exemple simple pour montrer comment la gestion de l'tat diffre dans les applica-tions Web de ce qu'elle est dans les applications classiques.

    La page PageEtat1 prsente un contrle TextBox (txtNom) et un bouton OK (btnOK). Quand l'uti-lisateur clique sur le bouton, le contenu de la zone de saisie est recopi dans une variable declasse appele Nom (il s'agit d'un membre de la classe associe la page) :

    ' Variable contenant le nomPrivate Nom As String

    Private Sub btnOK_Click(...) Handles btnOK.Click' Stocke le nom dans une variableNom = txtNom.Text

    End Sub

    Un second bouton sur la page (btnAfficheNom) permet d'afficher dans un contrle Label(lblNom) le contenu de la variable Nom (figure 7-1) :

    Private Sub btnAfficheNom_Click(...) Handles btnAfficheNom.Click' Affiche le contenu de la variablelblNom.Text = Nom

    End Sub

    Figure 7.1 La page PageEtat1 ne conserve pas la valeur de la donne

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    224

    Le seul problme avec ce code est qu'il ne fonctionne pas comme on le souhaite : le texte n'estjamais affich dans le label ! Si on excute l'application pas pas, on peut voir que la variableNom est vide lors de la dernire affectation.

    Cela s'explique par le fait qu' chaque demande d'une page de l'utilisateur, ASP.NET recre unnouvel objet pour la gestion de la page, selon la classe qui lui est associe (dans notre exemple,la classe est appele EtatPage1). Cet objet ne dure donc que le temps de traitement de la pagepar le serveur, grosso modo entre les vnements Load et Unload de la page. Ds que la pageest retourne l'utilisateur, l'objet correspondant est dtruit et des donnes disparaissent(figure 7-2).

    NoteL'exemple se trouve dans la page EtatPage1 du projet Etat du rpertoire 07 des exemples.

    Figure 7.2 chaque nouvelle page correspond un nouvel objet

  • Applications ASP.NET avec VB.NET

    225

    La solution cet pineux problme est de stocker les donnes, non pas dans des variables declasse, mais dans une zone o elles seront retrouves d'une page l'autre (figure 7-3). ASP.NETpropose plusieurs techniques pour cela, qui sont prsentes dans les sections suivantes.

    Stockage des donnes sur le clientLes techniques exposes dans cette section stockent les donnes sur le client. Si cela permetd'allger la charge du serveur, les donnes sont transportes avec chaque demande du clientvers le serveur, et chaque rponse du serveur.

    Figure 7.3 Les donnes sont stockes dans une zone spcifique

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    226

    Les donnes d'tat de la page

    chaque page est associ un tat d'affichage (View State), qui stocke l'ensemble des donnesde la page et de ses contrles. Cet tat d'affichage est implment dans un objet de classeStateBag (littralement, sac d'tat), qui enregistre les donnes sous la forme de paires de clset de valeurs, dans un dictionnaire.

    Ces donnes sont transportes du serveur une page sur le poste de l'utilisateur, puis de celle-ci au serveur nouveau, dans un champ cach du formulaire (un champ de type ). Le contenu de ce champ correspond l'ensemble des valeurs qui se trouventdans l'objet StateBag, codes de telle faon qu'elles soient transportables sur le protocole HTTPet qu'il ne soit pas facile de les dcoder ou de les modifier.

    L'tat d'affichage n'est utilisable que sur la mme page appele plusieurs fois, pas entre plu-sieurs pages diffrentes.

    On peut accder l'objet StateBag associ une page grce la proprit ViewState de l'objetPage. La cl associe une donne est automatiquement cre si celle-ci n'existe pas, ou elleest remplace dans le cas contraire. On peut ainsi crire :

    ViewState("Nom") = Value

    pour stocker le contenu de Value sous le nom Nom. On pourra ensuite relire cette donne :

    Nom = ViewState("Nom")

    On peut ainsi transformer la page de l'exemple prcdent afin de stocker le nom, non plus dansune variable de la classe, mais dans l'objet StateBag de la page. Pour minimiser les modifica-

    NotePour que l'tat d'affichage soit oprationnel, il faut que la proprit EnableViewState de la page soit True.

    AttentionToutes les donnes stockes dans le StateBag sont transmises au client. Il convient donc d'en limiter lataille. La mise en place de variables importantes dans le sac d'tat peut faire grossir les pages de faonexcessive.

  • Applications ASP.NET avec VB.NET

    227

    tions, on peut remplacer la dclaration de la variable Nom par une proprit de mme nom et quiutilise l'objet StateBag :

    Private Property Nom() As StringGet

    Nom = ViewState("Nom")End GetSet(ByVal Value As String)

    ViewState("Nom") = ValueEnd Set

    End Property

    Ainsi, le code qui utilise la donne Nom reste le mme :

    Private Sub btnOK_Click(...) Handles btnOK.Click' Stocke le nom dans une variableNom = txtNom.Text

    End Sub

    Private Sub btnAfficheNom_Click(...) Handles btnAfficheNom.Click' Affiche le contenu de la variablelblNom.Text = Nom

    End Sub

    Avec cette nouvelle version, le nom s'affiche bien quand on clique sur le bouton (figure 7-4).

    Figure 7.4 La page PageEtat1 conserve la valeur de la donne

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    228

    Les proprits des contrles

    Le sac de proprits rfrenc par la proprit ViewState de la page est utilis par ASP.NET pourconserver les valeurs des proprits des contrles de la page. Il faut en fait distinguer deuxfaons de dfinir la valeur d'une proprit :

    En phase de cration, on peut donner des valeurs aux proprits des contrles l'aide del'environnement de conception des pages de la fentre des proprits, ou directementdans le code HTML. Toutes ces modifications sont stockes dans la page aspx, dans le codeHTML, principalement sous la forme d'attributs de balises.

    En phase d'excution, les valeurs des proprits peuvent tre modifies par des instruc-tions de code Visual Basic .NET. Par exemple :

    txtNom.BackColor = Color.Yellow

    Les valeurs des proprits dfinies en phase de cration ne sont jamais perdues. Lors de la gn-ration d'une page, chaque contrle est cr avec les valeurs des proprits tablies initialement.

    En revanche, les valeurs des proprits modifies par le code peuvent tre perdues, selon lavaleur de la proprit EnableViewState de la page et des contrles.

    Nous allons illustrer cela travers une page comprenant deux contrles TextBox appelstxtNom1 et txtNom2. Un bouton dont le texte est En jaune change la couleur de fond des deuxcontrles, en modifiant la valeur de leur proprit BackColor :

    Private Sub btnChange_Click(...) Handles btnChange.ClicktxtNom1.BackColor = Color.YellowtxtNom2.BackColor = Color.Yellow

    End Sub

    Un second bouton, OK, ne fait rien de particulier, si ce n'est qu' son activation, la page estsoumise au serveur et regnre, sans qu'aucun code spcifique ne soit excut sur le serveur.

    Initialement, la valeur de la proprit EnableViewState de la page et des contrles est True.Quand on clique sur le bouton En jaune, la couleur de fond des deux contrles TextBox devientbien jaune, car le code ci-dessus a modifi cette couleur. Quand on clique ensuite sur le boutonOK, la couleur reste jaune bien qu'aucun code spcifique n'ait t excut sur le serveur. Cela

    NoteL'exemple se trouve dans la page EtatPage2 du projet Etat du rpertoire 07 des exemples.

  • Applications ASP.NET avec VB.NET

    229

    signifie que la valeur de la couleur de fond des deux contrles a bien t place dans le sac deproprits et a t utilise par ASP.NET lors de la rgnration des contrles aprs le clic sur lebouton OK.

    Si on donne la proprit EnableViewState du second contrle TextBox la valeur False, et qu'onclique sur le bouton En jaune puis sur OK, le fond du premier contrle est bien jaune (Enable-ViewState est toujours True), mais celui du second contrle ne l'est plus (figure 7-5). L'tat ducontrle n'a pas t transmis.

    Si maintenant on donne la proprit EnableViewState de la page la valeur False, la couleurde fond des deux contrles texte est perdue aprs avoir cliqu sur OK, quelle que soit la valeurde la proprit EnableViewState des contrles. Les valeurs des proprits des lments de lapage modifies par le code ne sont pas conserves d'une page l'autre.

    Figure 7.5 L'tat n'est transmis que pour le contrle dont la proprit EnableViewState est True

    NoteOn peut voir les donnes qui sont transmises entre le client et le serveur par l'intermdiaire du sac d'tat,en affichant le code source de la page dans le navigateur du client, et en recherchant la balise . La valeur de cette balise correspond au contenu du sac d'tat cod.

    NoteL'exemple se trouve dans la page Prop du projet Etat du rpertoire 07 des exemples.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    230

    Utilisation de champs cachs

    Le sac d'tat prsent prcdemment stocke en fait les donnes dans un champ cach, sur leclient. On peut utiliser la mme technique pour stocker d'autres donnes. Il suffit, pour cela,d'ajouter une balise de champ cach dans un formulaire. Lors de lagnration de la page contenant le formulaire, on peut donner une valeur au champ cach, parexemple un identificateur d'enregistrement. Quand l'utilisateur valide la page et renvoie le for-mulaire, l'application peut lire la valeur afin de retrouver l'identificateur en cours de traitement.

    L'exemple suivant montre comment mettre cela en uvre dans un formulaire, en utilisant uncontrle serveur HTML. La page ChampCache comprend un bouton de commande et un champcach appel Cach (figure 7-6). Lors de l'initialisation de la page, dans le traitement de l'v-nement Load pour la page, le champ cach est format avec une valeur correspondant, parexemple, un identificateur :

    Private Sub Page_Load(...) Handles MyBase.LoadIf Not IsPostBack Then

    ' Premier chargement, stocke l'identificateurCach.Value = 5

    End IfEnd Sub

    Quand on clique sur le bouton OK, le formulaire est soumis au serveur. On peut alors rcuprerla valeur stocke dans le champ cach pour raliser les traitements ncessaires. Ici, la valeurest affich dans un contrle Label :

    Figure 7.6 La page ChampCache stocke une donne dans un champ cach

  • Applications ASP.NET avec VB.NET

    231

    Private Sub btnVoir_Click(...) Handles btnVoir.Click' Relit l'indentificateurlblID.Text = Cach.Value

    End Sub

    Si vous affichez le code source de la page partir du navigateur, vous pouvez y voir la lignesuivante. L'utilisateur lambda ignore ce champ, mais l'expert peut facilement le voir :

    Passage de donnes par l'URL

    Une autre technique de passage des donnes d'une page l'autre consiste les placer dansl'URL, dans l'adresse de la page appeler.

    Quand l'utilisateur clique sur un lien ou sur un bouton d'un formulaire, l'application ajoute desparamtres l'URL correspondante. Le format d'une URL avec paramtres est le suivant :

    URL?nom1=valeur1&nom2=valeur2

    L'ensemble des paramtres est plac la fin de l'URL, aprs un point d'interrogation. Chaqueparamtre est constitu d'un nom et d'une valeur, spars par un signe =. Les paramtres sontspars entre eux par un signe &.

    Le nom et la valeur des paramtres placs dans l'URL sont soumis certaines restrictions. Il nepeut notamment pas y avoir de caractres accentus ou d'espaces. On peut utiliser la mthodeUrlEncode de l'objet HttpServerUtility retourne par la proprit Server de la page. Cettemthode prend en paramtre une chane de caractres et retourne la mme chane, dans laquelleles caractres interdits ont t cods. La mthode UrlDecode effectue l'opration inverse.

    La page appele par l'URL peut rcuprer ces donnes l'aide de la mthode QueryString del'objet HttpRequest retourne par la proprit Request de la page.

    Les exemples de cette section et des suivantes mettent en uvre une page de saisie d'un nom,SaisieNom. Cinq boutons permettent d'appeler une autre page avec une mthode de passagedu nom diffrente (figure 7-7).

    NoteL'exemple se trouve dans la page ChampCache du projet Etat du rpertoire 07 des exemples.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    232

    Quand on clique sur le premier bouton, Affiche avec URL, le code suivant est excut pourconstruire l'URL avec ses paramtres :

    Private Sub btnOKURL_Click(...) Handles btnOKURL.ClickResponse.Redirect("AfficheNomURL.aspx?Nom=" & Server.UrlEncode(txtNom.Text))

    End Sub

    Ce code utilise la mthode UrlEncode. Le texte de la zone de saisie est ici Grard Frantz. Lersultat de l'appel de la mthode UrlEncode(txtNom.Text) est : G%c3%a9rard+Frantz. Le carac-tre accentu est cod, ainsi que l'espace.

    La page appele, AfficheNomURL, rcupre le nom partir de l'URL grce la mthode Query-String, puis l'affiche dans la page (figure 7-8) :

    Private Sub Page_Load(...) Handles MyBase.LoadlblNom.Text = Request.QueryString("Nom")

    End Sub

    Figure 7.7 La page de saisie d'un nom permet d'appeler d'autres pages et de leur passer des donnes

  • Applications ASP.NET avec VB.NET

    233

    Stockage des donnes dans des cookies

    Un cookie est du texte stock sur le poste du client. Il est gnralement enregistr la demandedu serveur, par l'intermdiaire de la proprit Cookies de l'objet HttpResponse retourn par laproprit Response de la page. Il peut tre lu travers la proprit Cookies de l'objet HttpRe-quest retourn par la proprit Request de la page.

    Pour crire un cookie, qui est un couple nom-valeur, il suffit de lui donner une valeur, en indi-quant son nom comme paramtre de la collection Cookies. Si le cookie existait dj, il estremplac, dans le cas contraire, il est cr :

    sResponse.Cookies("MonCookie").Value = "La valeur"

    Figure 7.8 Affichage du nom aprs passage par l'URL

    NoteL'exemple se trouve dans les pages SaisieNom et AfficheNomURL du projet Etat du rpertoire 07 desexemples.

    NoteUn cookie ne contient que du texte et il ne peut tre atteint que par l'application (le site Web) qui l'a crit.Contrairement des croyances bien tablies, un cookie n'est donc pas dangereux, dans la mesure o il estpassif et ne correspond pas du code. Les sites Web utilisent souvent des cookies pour mmoriser le faitque l'utilisateur est pass par une page, et pour ventuellement stocker des informations lies cetutilisateur (par exemple ses gots, dduits de son parcours dans le site). Cela permet d'ajuster le contenudes pages du site lors d'une visite ultrieure.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    234

    Un cookie crit de cette faon n'est pas permanent : il n'existe qu'en mmoire, donc pendant ladure de l'application. Il disparatra quand celle-ci s'arrtera.

    Pour rendre un cookie permanent, il faut indiquer une date d'expiration. Par exemple :

    Response.Cookies("MonCookie").Value = "La valeur"Response.Cookies("MonCookie").Expires = #1/1/2030#

    Le cookie sera alors crit sur le disque de l'utilisateur et y restera jusqu' la date d'expirationou jusqu' ce qu'il soit effac.

    On peut lire un cookie en utilisant la mme collection Cookies, mais applique l'objet HttpRe-quest. Voici le code qui relit le cookie crit prcdemment :

    MonCookie = Request.Cookies("MonCookie").Value

    Si le cookie existait dans cette application, sa valeur est retourne. Dans le cas contraire, lavaleur de retour est une chane de caractres vide.

    L'ensemble des cookies d'une application est transmis avec chaque demande de l'utilisateur. Ilest donc prfrable de ne placer que de petites quantits de donnes dans les cookies, afin dene pas grossir la trame HTTP circulant sur le rseau, d'autant plus que la taille d'un cookie estelle-mme limite.

    NoteL'emplacement prcis des cookies dpend du navigateur utilis. Sous Windows XP, par exemple, InternetExplorer place les cookies dans des fichiers texte situs dans le rpertoire Cookies des donnes del'utilisateur.

    NoteL'utilisation de cookies peut tre dsactive sur le poste de l'utilisateur. Si le fonctionnement de votreapplication dpend de leur emploi, il faut soit disposer d'une mthode alternative, soit avertir l'utilisateurque l'application ne fonctionnera pas correctement avec sa configuration.

    L'application peut savoir si le navigateur autorise les cookies en interrogeant la proprit Cookies de l'objetHttpBrowserCapabilities, retourn par la proprit Browser de Request : Request.Browser.Cookie est Truesi le navigateur autorise les cookies, False dans le cas contraire.

  • Applications ASP.NET avec VB.NET

    235

    La page exemple SaisieNom (figure 7-7) dispose d'un bouton Affiche avec cookie. Quand l'uti-lisateur clique dessus, le contenu du champ de saisie est plac dans un cookie temporaireappel Nom. L'application est ensuite redirige vers une autre page, l'aide de la mthode Redi-rect de l'objet HttpResponse :

    Private Sub btnOKCookie_Click(...) Handles btnOKCookie.ClickResponse.Cookies("Nom").Value = txtNom.Text' Supprimez le commentaire de la ligne suivante pour rendre le cookie permanent'Response.Cookies("Nom").Expires = #1/1/2030# Response.Redirect("AfficheNomCookie.aspx")

    End Sub

    La page AfficheNomCookie affiche le texte lu dans le cookie (figure 7-9) :

    Private Sub Page_Load(...) Handles MyBase.LoadlblNom.Text = Request.Cookies("Nom").Value

    End Sub

    Figure 7.9 Affichage du nom aprs passage par cookie

    NoteL'exemple se trouve dans les pages SaisieNom et AfficheNomCookie du projet Etat du rpertoire 07 desexemples.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    236

    Stockage des donnes sur le serveurToutes les techniques prsentes prcdemment stockent les donnes sur le poste du client.Celles de cette section les placent sur le serveur. Cela prsente quelques avantages :

    Les donnes ne sont jamais visibles par le client.

    Elles ne circulent pas sur le rseau et ne l'encombrent donc pas.

    Elles ne sont pas lies au poste utilis par le client, comme c'est le cas pour les cookies(si l'utilisateur utilise un autre poste, il ne dispose pas de ses cookies).

    Leur accs est plus rapide, puisqu'elles se trouvent dj sur le serveur.

    Le stockage des donnes sur le serveur prsente galement quelques inconvnients :

    Les donnes occupent de la place sur le serveur, ce qui peut devenir ennuyeux si beaucoupd'utilisateurs accdent l'application.

    L'utilisateur peut tre li au serveur sur lequel se trouvent les donnes, bien qu'ASP.NETpropose des solutions pour cela.

    Les variables d'application

    Une variable d'application est conserve dans un objet particulier, de classe HttpApplication,retourn par la proprit Application de la page. Cet objet comprend des donnes lies uneapplication. Au fait, qu'est-ce qu'une application Web ? Il s'agit de l'ensemble des fichiers,pages, gestionnaires, modules et code situs dans un rpertoire virtuel et ses sous-rpertoiressur un serveur Web donn.

    Pour crer une variable d'application, il suffit de la nommer et de lui donner une valeur, un peucomme pour les cookies prsents plus haut :

    Application("NomVariable") = "Valeur variable"

    Si la variable du nom indiqu existait dj, sa valeur est remplace, sinon elle est cre.

    L'utilisation de variables d'application est donc extrmement simple. Il faut cependant fairequelques remarques :

    Une variable d'application est vue par tous les utilisateurs de l'application. Il ne faut doncpas y stocker des donnes spcifiques un utilisateur, mais plutt des donnes communes toute l'application, par exemple le nom de la socit ou une table de taux de TVA.

  • Applications ASP.NET avec VB.NET

    237

    Les variables d'application sont stockes dans le serveur Web qui les cre. Dans le casd'une ferme de serveurs (plusieurs serveurs qui jouent des rles semblables), la demanded'un utilisateur peut tre dirige vers un serveur ou un autre selon leur charge. Une appli-cation peut donc ne pas disposer des donnes cres par la mme application sur un autreserveur.

    Lors de la modification de la valeur d'une variable d'application, il existe un risque qued'autres utilisateurs effectuent un changement de la mme variable au mme moment. Ilconvient donc de synchroniser l'accs ces variables, comme cela est montr dansl'exemple suivant.

    On place donc gnralement dans les variables d'application des donnes en lecture seule. Cesvariables sont alors utilises comme une sorte de cache pour des donnes qui ne varient pasou peu pendant la dure de vie de l'application.

    Il faut cependant bien initialiser les variables d'application quelque part. Cela peut tre faitquand l'application dmarre, en plaant du code spcifique dans le fichier global.asax del'application qui est ajout un projet Web par Visual Studio .NET lors de sa cration. Ce fichiercomprend des donnes et du code globaux l'application. On peut notamment y ajouter desprocdures qui seront appeles par le serveur Internet quand certains vnements se produi-ront. Il suffit, pour cela, de driver une classe de la classe HttpApplication et d'y crire lesprogrammes ncessaires. Pour grer les variables application, on peut crire du code dans lesprocdures suivantes :

    Init et Application_OnStart sont appeles au dmarrage de l'application. On y insredonc gnralement le code d'initialisation des variables.

    Dispose et Application_OnEnd sont appeles quand l'application se termine.

    On peut remarquer qu'il existe deux procdures pour le dmarrage et l'arrt de l'application.Les constructeurs et destructeurs Init et Dispose sont appels pour chaque objet HttpAppli-cation cr, tandis que les procdures Application_OnStart et Application_OnEnd sontappeles la premire cration. Il est donc gnralement prfrable d'initialiser les donnesdans le constructeur Init.

    NoteUne application dmarre la premire fois qu'un utilisateur appelle une page qui en fait partie. Si le serveurWeb est arrt, elle l'est aussi. D'autre part, si le fichier global.asax est modifi, l'application est arrtepuis redmarre.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    238

    La page AfficheNomApplication affiche une donne place dans une variable Applicationappele Nom par la page appelante, SaisieNom. Celle-ci excute le code suivant lors du clic surle bouton Affiche avec application :

    Private Sub btnOKApplication_Click(...) Handles btnOKApplication.ClickApplication.Lock()Application("Nom") = txtNom.TextApplication.UnLock()Response.Redirect("AfficheNomApplication.aspx")

    End Sub

    On peut remarquer dans ce code que l'affectation de la valeur la variable Application estaccompagne d'un appel aux mthodes Lock puis UnLock. Lock verrouille l'objet Applicationafin d'viter qu'une modification y soit effectue en mme temps par un autre thread.

    La page AfficheNomApplication affiche la valeur stocke dans la variable Application lors deson chargement :

    Private Sub Page_Load(...) Handles MyBase.Load' Donne initialie par la page appelantelblNom.Text = Application("Nom")

    ' Donnes initialises dans Global.asaxlblInit.Text = Application("Init")lblOnStart.Text = Application("OnStart")

    End Sub

    Vous pouvez remarquer que le code de traitement de l'vnement Load affiche galement lesvaleurs de deux autres variables (figure 7-10). Celles-ci ont t initialises dans des procduresvnement de Global.asax :

    Public Class GlobalInherits System.Web.HttpApplication

    AttentionL'appel la mthode Lock verrouille l'objet Application de faon globale. Les autres pages quiappelleraient cette mme mthode seraient bloques. Il convient donc de recourir UnLock aussirapidement que possible et de n'effectuer que des traitements courts entre les deux requtes.

  • Applications ASP.NET avec VB.NET

    239

    Public Overrides Sub Init()Application("Init") = "Donne initialise dans Init"

    End Sub

    Sub Application_OnStart(ByVal sender As Object, ByVal e As EventArgs)Application("OnStart") = "Donne initialise dans Application_OnStart"

    End SubEnd Class

    Les variables partages

    L'utilisation de l'objet Application pour conserver des donnes tait courante dans les versionsprcdentes d'ASP. Elle prsente cependant quelques inconvnients, particulirement le fait queles donnes n'y sont pas types, ce qui allonge les temps de traitement lorsqu'on y accde.

    On pourrait tre tent d'utiliser des variables d'instance de l'objet Application (appel Globalpar dfaut) dclar dans Global.asax. Cela n'est cependant pas possible, car il peut exister plu-sieurs objets Application crs partir de la classe Global. Quand une page est appele sur leserveur, ASP.NET peut, soit fabriquer un nouvel objet Global, soit utiliser un objet existant. Onne peut donc pas avoir de certitude sur l'objet Global employ par une page, et ses variablesd'instance ne peuvent donc pas tre mmorises d'un appel l'autre.

    Il est cependant possible de dclarer des variables partages dans la classe Global avec le mot-cl Shared. Une telle variable s'utilise indpendamment de la cration d'un objet, elle est doncglobale l'application.

    Figure 7.10 Affichage du nom aprs passage par une variable Application

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    240

    Voici, par exemple, une variable dclare dans Global.ascx, dans la classe Global :

    Public Class GlobalInherits System.Web.HttpApplication

    Public Shared Nom As String

    La variable Nom peut alors tre valorise dans une page, comme dans la page SaisieNom lasuite d'un clic sur le bouton Affiche avec variable Shared :

    Private Sub btnOKShared_Click(...) Handles btnOKShared.ClickSyncLock Me

    Global.Nom = txtNom.TextEnd SyncLockResponse.Redirect("AfficheNomShared.aspx")

    End Sub

    Le problme de l'accs simultan la donne par plusieurs threads se pose nouveau. Il estrgl ici en plaant le code qui accde la donne dans une section de synchronisation, ce quigarantit qu'un seul thread peut excuter la section la fois.

    L'utilisation de la donne se fait dans une autre page, AfficheNomShared (il n'est pas ncessairede synchroniser l'accs la donne en lecture seule, figure 7-11) :

    Figure 7.11 Affichage du nom aprs passage par une variable partage

  • Applications ASP.NET avec VB.NET

    241

    Private Sub Page_Load(...) Handles MyBase.LoadlblNom.Text = Global.Nom

    End Sub

    Les variables de session

    Si les variables d'application sont intressantes pour stocker les donnes d'une application,elles ne permettent pas de distinguer un utilisateur d'un autre. Les variables de session rpon-dent cette insuffisance, car elles sont associes l'utilisateur courant.

    La notion de session

    Pour mettre en uvre les variables de session, ASP.NET dfinit une notion de session qui com-prend l'ensemble des actions d'un utilisateur dans une application. Une session est reconnuepar un identificateur de session cr par ASP.NET. Il s'agit d'une chane de caractres de 120bits (par exemple, 302dvbynpstxl3i0rugg1b45), dont l'unicit est garantie grce l'utilisationd'un algorithme spcifique. De plus, la structure de cette chane est non triviale, ce qui vitequ'elle soit manipule l'insu du systme (par exemple, pour se faire passer pour quelqu'und'autre).

    Quand un nouvel utilisateur appelle une page d'une application ASP.NET pour la premire fois,un nouvel identificateur lui est attribu. Celui-ci accompagne ensuite toutes les rponses dusystme et les demandes de l'usager, ce qui permet de l'identifier. Deux techniques peuventtre utilises pour cela : un cookie particulier enregistr sur le poste de l'utilisateur, ou l'inclu-sion de l'identificateur dans l'URL, essentiellement si les cookies ne sont pas autoriss par lenavigateur de l'utilisateur.

    Pour accder aux informations d'une session, la classe Page expose une proprit, Session, quiretourne une rfrence un objet HttpSessionState. Celui-ci dispose de proprits et demthodes, dont la proprit SessionID qui renvoie l'identificateur de session courant. On peutcrire, pour placer l'identificateur de session dans un contrle label appel lblSessionID :

    lblSessionID.Text = Session.SessionID

    Le rsultat est une chane de caractres comprenant l'identificateur de session (voir l'exemplesuivant).

    La configuration de la faon dont la session fonctionne se fait dans le fichier Web.config, situdans le rpertoire d'une application Web. Il s'agit d'un fichier XML comprenant, entre autres,une balise appele sessionState qui fait partie de la section system.web du fichier. Cette balisecomprend plusieurs attributs qui dfinissent les caractristiques de la session (tableau 7-1).

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    242

    Voici le contenu initial de cette section, tel qu'il est gnr par Visual Studio :

    ...

    ...

    Quand l'attribut cookieless a sa valeur par dfaut False, le SessionID est transmis sur le postede l'utilisateur par l'intermdiaire d'un cookie. En revanche, si on donne cookieless la valeurTrue, le SessionID est transmis dans l'URL, sous la forme d'un pseudo-rpertoire dont le nomest la valeur de l'identificateur.

    Tableau 7-1 Les attributs de la section system.web du fichier web.config.

    Attribut Signification

    cookieless Indique si des cookies sont utiliss pour transmettre l'identificateur de session sur le poste du client (valeur False) ou l'URL (valeur True)

    Mode Dsigne l'emplacement des donnes de la session (notamment les variables). Voir ci-dessous.

    stateConnectionString Il s'agit d'une chane qui identifie le serveur utilis si mode vaut StateServer.

    sqlConnectionString Chane qui identifie le serveur SQL utilis si mode vaut SQLServer.

    Timeout Dtermine le temps d'inactivit en minutes au-del duquel la session est automatiquement termine.

    NoteLe fichier Web.config est cr par Visual Studio lors de la cration d'une nouvelle application Web. Vouspouvez double-cliquer dessus dans l'explorateur de solutions pour en afficher ou en modifier le contenu.

  • Applications ASP.NET avec VB.NET

    243

    L'attribut mode indique l'emplacement de stockage des variables. La modification de la valeurde cet attribut peut avoir une influence sur les performances et sur la disponibilit des donnesde session. Les valeurs possibles sont les suivantes :

    Off, les donnes de session ne sont pas gardes. Les variables de session ne doivent doncpas tre utilises si mode a cette valeur.

    InProc, les donnes de session sont stockes en mmoire sur le serveur. Cette valeurdonne les meilleures performances (il s'agit d'ailleurs de la valeur par dfaut), mais nepermet pas de conserver les donnes en cas de panne ou d'utilisation de plusieurs ser-veurs ou processus.

    StateServer, les donnes de session sont gardes sur le serveur identifi par la valeur destateConnectionString. Cette chane doit comprendre l'adresse du serveur suivie du port utiliser, qui est par dfaut 42424. La valeur par dfaut, tcpip=127.0.0.1:42424, indiqueque les donnes sont stockes sur le serveur local (l'adresse IP 127.0.0.1 identifie leserveur local).

    SQLServer, les donnes de session sont stockes sur le serveur SQL Server identifi parla valeur de sqlConnectionString. Il s'agit d'une chane de connexion SQL Server.

    Les deux dernires options sont particulirement intressantes et n'existaient pas dans les ver-sions prcdentes d'ASP. Elles permettent de partager les donnes de session entre plusieursprocessus.

    La valeur StateServer indique que les donnes de la session sont places sur le serveur spcifipar stateConnectionString (un serveur d'tat). On peut alors envisager deux configurations :

    Il n'existe qu'un serveur Web, mais plusieurs processus peuvent faire fonctionner la mmeapplication. L'utilisation de cette valeur permet de ne pas lier un utilisateur un processusparticulier. La valeur InProc ferait que, si l'utilisateur tait connect un processus diff-rent d'une page l'autre, les valeurs de ses variables de session seraient perdues.

    Quand plusieurs serveurs Web sont utiliss pour la mme application (on parle de fermede serveurs), le serveur d'tat peut tre commun l'ensemble des serveurs Web. De cettefaon, les demandes d'un utilisateur ne sont pas lies un serveur physique particulieret la rpartition de charge entre les serveurs peut tre pleinement exploite.

    AttentionSi l'attribut cookieless a sa valeur par dfaut False et que les cookies ne sont pas oprationnels sur leposte de l'utilisateur, l'identificateur de session et donc les valeurs des variables ne seront pas mmoriss.

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    244

    La valeur SQLState de l'attribut mode permet d'aller encore plus loin, puisque les donnes desvariables d'application sont places sur un serveur SQL Server. De cette faon, mme si unserveur Web tombe en panne, les donnes ne sont pas perdues.

    Le dernier attribut de la balise sessionState, timeout, indique le temps d'inactivit, en minutes,aprs lequel la session est ferme. Par dfaut, cette valeur est de vingt minutes. La fermetured'une session permet de librer toutes les donnes qui lui sont associes. Si l'application gredes donnes sensibles, comme un compte en banque, il peut tre prfrable de diminuer cettevaleur, afin de ne pas garder en mmoire des donnes concernant un utilisateur qui n'utiliseplus l'application. On peut d'ailleurs forcer une fin de session, en appelant la mthode Abandon :

    Session.Abandon

    Cela peut tre effectu, par exemple, en rponse un clic de l'utilisateur sur un bouton de dcon-nexion plac sur la page. Aprs la fermeture d'une session, automatiquement ou manuellement,toutes ses donnes sont dtruites.

    Les variables de session

    Comme les variables d'application, les variables de session sont simplement fabriques en lesnommant : si la variable existe, elle est utilise, sinon elle est cre. Pour donner une valeur la variable de session Nom, on peut simplement crire :

    Session("Nom") = "Nouvelle valeur"

    L'initialisation des variables de session peut se faire dans une procdure Session_OnStart (ouSession_Start) et Session_OnEnd permet d'effectuer les traitements de fin de session. Ces deuxprocdures doivent tre crites dans le fichier global.asax, comme cela a t expliqu dans lasection relative aux variables d'application.

    La page AfficheNomSession affiche une variable de session initialise lors de la saisie du nomde l'utilisateur dans la page SaisieNom. Elle affiche galement la valeur d'une variable initialisedans la procdure Session_OnStart (figure 7-12).

    NoteIl n'est pas ncessaire de mettre en uvre un mcanisme de synchronisation pour les variables de session,car elles ne sont normalement rejointes que par un seul thread, n'tant lies qu' un seul utilisateur.

  • Applications ASP.NET avec VB.NET

    245

    La valorisation de la variable la suite de la saisie du nom est effectue par le code suivant :

    Private Sub btnOKSession_Click(...) Handles btnOKSession.ClickSession("Nom") = txtNom.TextResponse.Redirect("AfficheNomSession.aspx")

    End Sub

    L'initialisation des variables dans global.asax est :

    Sub Application_OnStart(ByVal sender As Object, ByVal e As EventArgs)Application("OnStart") = "Donne initialise dans Application_OnStart"

    End Sub

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)Session("Start") = "Donne initialise dans Session_Start"

    End Sub

    Enfin, l'affichage des variables est ralis par le code suivant :

    Private Sub Page_Load(...) Handles MyBase.LoadlblNom.Text = Session("Nom")lblSessionID.Text = Session.SessionIDlblSession.Text = Session("Start")lblSession1.Text = Session("OnStart")

    End Sub

    Figure 7.12 Affichage de variables de session

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    246

    Le contexte

    La proprit Context d'une page retourne l'objet HttpContext associ la page. Celui-ci fournitdes informations sur la requte HTTP ayant provoqu son appel. Parmi les membres de la classeHttpContext, la proprit Handler donne accs un objet HttpHandler qui reprsente la page l'origine de l'appel. Cela permet d'accder ses donnes.

    Pour que le contexte permette de rcuprer les donnes de la page prcdente, il faut quel'appel de la page se fasse l'aide de la mthode Server.Transfer et non pasResponse.Redirect.

    L'utilisation du contexte peut se faire en castant la proprit Handler en un type correspon-dant la page appelante. La ligne suivante permet d'accder la proprit Nom dfinie dans lapage SaisieNom :

    Private Sub Page_Load(...) Handles MyBase.LoadlblNom.Text = CType(context.Handler, SaisieNom).Nom

    End Sub

    Voici le code de la page SaisieNom (figure 7-13) :

    ' Proprit Nom pour le contextePublic ReadOnly Property Nom() As String

    GetReturn txtNom.Text

    End GetEnd Property

    Private Sub btnOKContext_Click(...) Handles btnOKContext.Click' Utilise Server.Transfer au lieu de Response.RedirectServer.Transfer("AfficheNomContext.aspx")

    End Sub

    NoteLes donnes du contexte ne sont valides que pour la requte en cours. Elles sont donc perdues lors de larequte suivante.

  • Applications ASP.NET avec VB.NET

    247

    Le cache

    Le cache d'ASP.NET est un lieu de stockage de donnes qui peut tre utilis la fois pour cacherdes pages, c'est--dire les mmoriser afin d'viter de les rgnrer chaque demande, et pourenregistrer des donnes. Pour le stockage de donnes, le cache ressemble donc l'objet Appli-cation dans la mesure o les valeurs qui y sont places sont prives l'application. Mais lecache dispose galement de mcanismes complmentaires qui permettent de contrler la durede vie des donnes qu'il contient en librant la mmoire quand elle n'est pas utilise, ou deconditionner les donnes des ressources externes.

    Placer des donnes dans le cache se fait trs simplement, comme pour l'objet Application :

    Private Sub btnOKCache_Click(...) Handles btnOKCache.Click Cache("Nom") = txtNom.Text Response.Redirect("AfficheNomCache.aspx")End Sub

    On peut galement utiliser les mthodes Insert et Add de l'objet Cache pour ajouter des donnesdans le cache. Ces mthodes peuvent recevoir des paramtres complmentaires permettant dedfinir, notamment, la dure de vie des donnes.

    L'obtention des donnes du cache se fait tout aussi simplement (figure 7-14) :

    Private Sub Page_Load(...) Handles MyBase.Load lblNom.Text = Cache("Nom")End Sub

    Figure 7.13 Affichage d'une variable obtenue grce au contexte

  • Chapitre 7 - Gestion de ltat, la session, les cookies

    248

    Rsum du chapitreDans ce chapitre, nous avons vu que si la gestion de l'tat est un vritable problme pour lesapplications Web, elle dispose galement de nombreuses solutions. Plusieurs mcanismes per-mettent de stocker les donnes d'une page sur le client, ou sur le serveur. Des techniquesnouvelles dans ASP.NET permettent mme de stocker les donnes sur un serveur partag parplusieurs serveurs Web.

    Figure 7.14 Affichage de variables du cache

    NoteLe cache dispose de fonctionnalits supplmentaires, comme la libration automatique des donnes quandelles ne sont pas utilises