La gestion de l’état avec ASP.NET

Le monde du Web est sans état. Ceci signifie que les informations entrées sur une page seront perdues sur la page suivante.

Il existe cependant des mécanismes qui permettent de faire persister les données d'une page à l'autre. Sans ces mécanismes, il serait impossible, par exemple, de s'authentifier sur une page et de conserver l'authentification sur le reste du site Web.

Voici donc quelques-uns des mécanismes qui vous permettront de conserver des informations entre les pages du site : variables de session, variables de profil, ViewState et encodage d'URL.

▼Publicité

Les variables de session

Tout comme en PHP, il est possible de créer des variables de session en ASP.NET.

Par défaut, les sessions sont activées pour chaque page Web. Il n’y a donc rien de spécial à faire pour pouvoir utiliser les variables de session en ASP.NET.

Désactiver les sessions pour une page Web

Il est possible de désactiver les sessions sur une page particulière afin d’améliorer ses performances. Ceci se fait en ajoutant l’attribut EnableSessionState="False" dans la directive de page située en haut du fichier .aspx.

Les pages qui contiennent cet attribut ne pourront pas utiliser les variables de session.

Ex :

Fichier .aspx (ASP.NET)

<%@ Page ... EnableSessionState="False" %>

Durée d'une session

Il est possible de configurer la durée d'une session dans le fichier Web.config. La durée de la session correspond au délai pendant lequel une session peut demeurer inactive avant d'être abandonnée. Par défaut, la durée de la session est de 20 minutes. Pour la modifier, il faut entrer un attribut timeout dans le sessionState.

Ex :

Fichier Web.config (XML)

<system.web>

   ...

   <sessionState mode="InProc" timeout="10" />

   ...

</system.web>

La durée du timeout est en minutes. Dans l'exemple précédent, la session se terminera lorsque l'usager aura passé 10 minutes sans faire de requête au serveur ou lorsqu'il fermera son navigateur.

Utiliser les variables de session

L’extrait de code suivant permet d’ajouter une variable de session. La syntaxe est très similaire à celle utilisée en PHP.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

Session["produit_id"] = valeur;

Avant d’essayer de lire une variable de session, il faut toujours s’assurer qu’elle ait été initialisée.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

if (Session["produit_id"] != null)

{

   ...

}

else

{

   ...

}

À chaque fois qu’on lit une variable de session, il faut prendre soin de la transtyper car ASP.NET stoque les variables de session dans un vecteur de type Object.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

textBoxProduit.Text = Session["produit_description"].ToString() ;

estActif = (bool)Session["actif"];

Utiliser les variables de session dans un fichier .cs autre que le fichier Code Behind

Si vous travaillez avec une bibliothèque de fonctions, vous devrez prendre une précaution supplémentaire pour pouvoir accéder aux variables de session. En effet, ce type de fichier ne peut pas accéder directement à la variable Session. 

Vous devrez donc initialiser une variable de type System.Web.SessionState.HttpSessionState et lui assigner la valeur System.Web.HttpContext.Current.Session.

Ex :

Fichier .cs autre que le fichier Code Behind (ASP.NET avec C#)

System.Web.SessionState.HttpSessionState session = System.Web.HttpContext.Current.Session;

 

if (session["usager_id"] != null)

{

    ...

}

Variables de profil

Une autre technique pour passer des valeurs entre les pages Web d’un site consiste à utiliser les profils gérés par l’espace de nom System.Web.Profile. En fait, cette technique vise le rappel des informations d’utilisateur, comme leur nom, leurs préférences de couleurs, de langue, ou toute autre information selon les possibilités offertes par le site Web. Donc, les profils sont un mécanisme qui permet de personnaliser un site Web.

class="important">Par défaut, lorsque vous utilisez les profils de ASP.NET, une nouvelle base de données sera automatiquement créée : ASPNETDB.MDF.

Lorsque le site Web sera mis en ligne, cette base de données devra être copiée sur le serveur et configurée, au même titre que la base de données que vous avez créée de toutes pièces.

Il est cependant possible de modifier ce comportement afin d'utiliser la même base de données que pour le reste des données du site Web, comme nous le verrons dans le chapitre sur l'authentification.

Définir les propriétés du profil

Les propriétés que vous désirez conserver pour chaque utilisateur doivent être définies dans le fichier Web.config, dans la section <system.web>.

Ex :

Fichier Web.config (XML)

<system.web>

<profile automaticSaveEnabled="true" >

<properties>

<add name="Visites" type="System.Int32" allowAnonymous="true" />

<add name="Nom" type="System.String"/>

<add name="Langue" type="System.String"/>

<add name="Anniversaire" type="System.DateTime"/>

</properties>

</profile>

</system.web>

Utiliser les informations de profil

Les informations de profil peuvent être utilisées un peu comme les informations de session. La syntaxe est cependant différente puisque ASP.NET utilise une classe pour stocker et retrouver chaque propriété associée à un utilisateur.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

Profile.Visites = valeur;

Fichier .aspx.cs (ASP.NET avec C#)

if (Profile.Visites != null)

{

   ...

}

Fichier .aspx.cs (ASP.NET avec C#)

Variable = Profile.Visites;

Si vous n’avez pas spécifié « automaticSaveEnabled="true" » dans le fichier Web.config, il faudra sauvegarder manuellement les valeurs des propriétés.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

Profile.Save;

Consulter la BD des informations de profil

Les informations de profil sont stockées dans la base de données ASPNETDB.MDF. La table aspnet_Profile contient les données de profil de chaque utilisateur.

ViewState

Le ViewState est une autre technique permettant à une page Web de se rappeler de différentes valeurs. Par contre, la valeur ne sera conservée que lors d'un PostBack donc elle ne pourra pas être passée à une autre page Web.

Avec cette technique, ASP.NET utilise un champ caché appelé __VIEWSTATE pour stocker les données contenues dans les contrôles serveur d’une page Web.

Le champ caché __VIEWSTATE est passé du navigateur au serveur et vice-versa, ce qui permet à la page Web de connaître le contenu des informations qui avaient été enregistrées avant le PostBack.

Désactiver le ViewState pour un contrôle

Les contrôles serveur sont programmés pour écrire automatiquement leur valeur dans le champ __VIEWSTATE. Lors du prochain chargement de la page Web, les contrôles serveur liront leur valeur dans ce champ caché. Tout est fait automatiquement sans que vous ailliez à entrer une seule ligne de code.

Dans certains cas précis, vous aurez besoin de désactiver le ViewState d’un contrôle serveur, souvent pour des raisons de performance. Ceci est possible en ajoutant au contrôle l’attribut enableviewstate="false".

Ex :

Fichier .aspx (ASP.NET)

<asp:DropDownList ID="dropDownListAtteindre" runat="server" ... EnableViewState="false">

</asp:DropDownList>

Utiliser le ViewState pour stocker nos propres informations

Parfois, on peut avoir besoin d'un champ pour stocker de l'information tout au long du traitement d'une page Web. Malheureusement, le champ perdra sa valeur dès qu'un PostBack surviendra, par exemple lorsqu'on cliquera sur un bouton ou qu'on sélectionnera un élément dans une liste dont l'attribut AutoPostBack est à true. L'utilisation du ViewState est une solution intéressante à ce problème.

Le ViewState s'utilise un peu comme une variable de session sauf que sa valeur sera perdue dès qu'on changera de page.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

ViewState["code"] = leCode;

...

if (ViewState["code"] != null

{

   ...

}

Encodage d'URL

Il est possible de passera un ou plusieurs paramètres directement dans l'URL pour fournir de l'information sur ce qui doit être effectué sur la page. On appelle cette technique « Encodage d'URL ».

Un des avantages de l'encodage d'URL est que l'usager pourra retrouver les mêmes informations s'il conserve l'URL dans ses favoris. Ce ne serait pas le cas si les informations étaient passées par une variable de session, par exemple.

Ex :

Fichier .aspx.cs (ASP.NET avec C#)

int produit_id = ...;

String code = ...

...

Response.Redirect("DetailsProduit.aspx?id=" + produit_id.ToString() + "&code=" + code);

Notez que si la valeur du paramètre a été entrée par un usager (dans un TextBox, dans un cookie, etc.), il faudra s'assurer qu'elle est sûre avant le l'utiliser dans l'URL.

Retrouver la valeur d'un paramètre passé dans l'URL

Pour retrouver la valeur du ou des paramètres, on travaillera avec Request.QueryString.

Attention : les usagers peuvent facilement modifier les paramètres d'une URL. Vous devez toujours valider ces paramètres avant de les afficher à l'écran ou d'en faire toute autre utilisation.

Exemple avec un paramètre numérique :

Fichier .aspx.cs (ASP.NET avec C#)

protected void Page_Load(object sender, EventArgs e)

{

    // si le paramètre ne fait pas partie de l'URL, on retourne à la liste des produits

    if (Request.QueryString["id"] == null)

    {

        Response.Redirect("ListeProduits.aspx");

    }

 

    // on s'assure qu'on a bien reçu un nombre

    try

    {

        int produit_id = Convert.ToInt32(Request.QueryString["id"]);  

    }

    catch

    {

        Response.Redirect("ListeProduits.aspx");

    }

    ...

Exemple avec une chaîne de caractères :

Fichier .aspx.cs (ASP.NET avec C#)

protected void Page_Load(object sender, EventArgs e)

{

    // si le paramètre ne fait pas partie de l'URL, on retourne à la page d'accueil

    if (Request.QueryString["code"] == null)

    {

        Response.Redirect("~/");

    }

 

    // on s'assure que le code ne contient pas de caractères dangereux

    String code = NettoyerInput(Request.QueryString["code"]);   

 

    ...

}

 

/// <summary>

/// Nettoie une donnée entrée par un internaute afin de protéger contre certaines attaques

/// </summary>

/// <param name="parametre">Chaîne à nettoyer</param>

/// <returns>Chaîne nettoyée</returns>

protected string NettoyerInput(String input)

{

    input = WebUtility.HtmlEncode(input);   // encode les < et > en &lt; et &gt;. Encode aussi les caractères accentués

    input = input.Replace("%", "");    // empêche toute utilisation de notation hexa comme %0A pour un espace

    input = input.Replace("\\", "");   // pas de barre oblique inverse (donc pas d'espace simulé par une tabulation : \t)

    // au besoin, mettre les autres opérations de nettoyage ici, selon le contexte nécessité par l'application

    return input;

}

Pour plus d'information

« System Namespace ». MSDN. http://msdn.microsoft.com/en-us/library/system.aspx

« Gestion des utilisateurs Web avec des fournisseurs de profils personnalisés ». MSDN. http://msdn.microsoft.com/fr-ca/magazine/cc163457.aspx

« Personnalization ». JCWcn.com. http://tutorial.jcwcn.com/Web-Design/ASP-NET/NET/2007-07-04/1985.html

« Understanding ASP.NET View State ». MSDN. http://msdn.microsoft.com/en-us/library/ms972976

DE LÈNE MIROUZE Frédéric. « Le Gray's Anatomy du viewstate ». dotnetguru.org. http://www.dotnetguru.org/articles/dossiers/viewstate/viewstate.htm

« WebUtility.HtmlEncode, méthode (String) ». MSDN. https://msdn.microsoft.com/fr-ca/library/ee388364(v=vs.110).aspx

« HttpRequest.QueryString, propriété ». MSDN. https://msdn.microsoft.com/fr-fr/library/system.web.httprequest.querystring(v=vs.110).aspx

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories