Gestion de l'état de l'application
Utilisation de l'état de l'application
Cet exemple illustre l'utilisation de l'état de l'application pour lire un DataSet dans Application_Start.
Comme il est possible que différents threads accèdent simultanément à une application et à tous les objets qu'elle enregistre, n'enregistrez de préférence que les données rarement modifiées ayant une portée d'application. Idéalement, un objet est initialisé dans l'événement Application_Start et les accès suivants sont en lecture seule.
Dans l'exemple suivant, un fichier est lu dans Application_Start (défini dans le fichier Global.asax) et le contenu est enregistré dans un objet DataView, dans l'état de l'application.
void Application_Start() {
DataSet ds = new DataSet();
FileStream fs = new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);
StreamReader reader = new StreamReader(fs);
ds.ReadXml(reader);
fs.Close();
DataView view = new DataView(ds.Tables[0]);
Application["Source"] = view;
}
Sub Application_Start()
Dim ds As New DataSet()
Dim fs As New FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read)
Dim reader As New StreamReader(fs)
ds.ReadXml(reader)
fs.Close()
Dim view As New DataView (ds.Tables(0))
Application("Source") = view
End Sub
function Application_Start() : void {
var ds:DataSet = new DataSet();
var fs:FileStream = new FileStream(Server.MapPath("schemadata.xml"),FileMode.Open,FileAccess.Read);
var reader:StreamReader = new StreamReader(fs);
ds.ReadXml(reader);
fs.Close();
var view:DataView = new DataView(ds.Tables[0]);
Application("Source") = view;
}
|
|
C#
|
VB
|
JScript
|
|
Dans la méthode Page_Load, DataView est ensuite extrait et utilisé pour remplir un objet DataGrid :
void Page_Load(Object sender, EventArgs e) {
DataView Source = (DataView)(Application["Source"]);
...
MyDataGrid.DataSource = Source;
...
}
Sub Page_Load(sender As Object, e As EventArgs)
Dim Source As New DataView = CType(Application("Source"), DataView)
...
MyDataGrid.DataSource = Source
...
End Sub
function Page_Load(sender:Object, e:EventArgs) : void {
var Source:DataView = DataView((Application("Source")));
...
MyDataGrid.DataSource = Source;
...
}
|
|
C#
|
VB
|
JScript
|
|
L'avantage de cette solution est que seule la première demande paie le prix de la récupération des données. Toutes les demandes suivantes utilisent l'objet DataView existant. Comme les données ne sont jamais modifiées après l'initialisation, vous ne devez pas prendre de mesures pour sérialiser l'accès.
Utilisation de l'état de session
L'exemple suivant illustre l'utilisation de l'état de session pour enregistrer les préférences utilisateur volatiles.
Pour fournir des données particulières à un utilisateur pendant une session, elles doivent être enregistrées avec une portée de session. Dans l'exemple suivant, les valeurs des préférences utilisateur sont initialisées dans l'événement Session_Start du fichier Global.asax.
void Session_Start() {
Session["BackColor"] = "beige";
...
}
Sub Session_Start()
Session("BackColor") = "beige"
...
End Sub
function Session_Start() : void {
Session("BackColor") = "beige";
...
}
|
|
C#
|
VB
|
JScript
|
|
Dans la page de personnalisation suivante, les valeurs des préférences utilisateur sont modifiées dans le gestionnaire d'événements Submit_Click en fonction des données entrées par l'utilisateur.
protected void Submit_Click(Object sender, EventArgs e) {
Session["BackColor"] = BackColor.Value;
...
Response.Redirect(State["Referer"].ToString());
}
Protected Sub Submit_Click(sender As Object, e As EventArgs)
Session("BackColor") = BackColor.Value
...
Response.Redirect(State("Referer").ToString())
End Sub
protected function Submit_Click(sender:Object, e:EventArgs) : void {
Session("BackColor") = BackColor.Value;
...
Response.Redirect(State("Referer").ToString());
}
|
|
C#
|
VB
|
JScript
|
|
Les différentes valeurs sont extraites à l'aide de la méthode GetStyle :
protected String GetStyle(String key) {
return Session[key].ToString();
}
Protected GetStyle(key As String) As String
Return(Session(key).ToString())
End Sub
protected function GetStyle(key:String) : String {
return Session(key).ToString();
}
|
|
C#
|
VB
|
JScript
|
|
La méthode GetStyle est utilisée pour construire des styles propres à la session :
<style>
body
{
font: <%=GetStyle("FontSize")%> <%=GetStyle("FontName")%>;
background-color: <%=GetStyle("BackColor")%>;
}
a
{
color: <%=GetStyle("LinkColor")%>
}
</style>
Pour vérifier que les valeurs sont réellement enregistrées avec une portée de session, ouvrez la page exemple à deux reprises, puis modifiez une valeur de la première fenêtre du navigateur et actualisez la deuxième. La deuxième fenêtre adopte les modifications, car les deux instances du navigateur partagent un objet Session commun.
Configuration de l'état de session : Les fonctionnalités de l'état de session peuvent être configurées dans la section <sessionState> d'un fichier web.config. Pour doubler le délai par défaut de 20 minutes, vous pouvez ajouter les informations suivantes au fichier web.config d'une application :
Par défaut, ASP.NET stocke l'état de session dans le même processus que celui qui traite la demande, comme ASP. Si les cookies ne sont pas disponibles, le traçage d'une session est possible en ajoutant un identificateur de session à l'URL. Cette fonctionnalité peut être activée de la manière suivante :
Par défaut, ASP.NET stocke l'état de session dans le même processus que celui qui traite la demande, comme ASP. En outre, ASP.NET peut enregistrer les données de session dans un processus externe qui peut même résider sur un autre ordinateur. Pour activer cette fonctionnalité :
- Démarrez le service d'état de ASP.NET, soit à l'aide du composant logiciel enfichable Services, soit en exécutant "net start aspnet_state" sur la ligne de commande. Le service d'état écoute par défaut le port 42424. Pour changer de port, modifiez la clé de Registre correspondant au service : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSte\Services\aspnet_state\Parameters\Port
- Affectez à l'attribut mode de la section <sessionState> la valeur « StateServer ».
- Configurez l'attribut stateConnectionString à l'aide des valeurs de l'ordinateur sur lequel vous avez démarré aspnet_state.
L'exemple suivant suppose que le service d'état s'exécute sur le même ordinateur que le serveur Web (« localhost ») et utilise le port par défaut (42424) :
<sessionState
mode="StateServer"
stateConnectionString="tcpip=localhost:42424"
/>
Remarquez que si vous essayez l'exemple ci-dessus avec ce paramètre, vous pouvez réinitialiser le serveur Web (entrez iisreset sur la ligne de commande) et la valeur de l'état de session est conservée.
Utilisation des cookies côté client
L'exemple suivant illustre l'utilisation de cookies côté client pour enregistrer les préférences utilisateur volatiles.
Le stockage de cookies sur le client constitue l'une des méthodes utilisées par l'état de session de ASP.NET pour associer des demandes à des sessions. Les cookies peuvent aussi être utilisés directement pour rendre des données persistantes entre les demandes, mais les données sont ensuite enregistrées sur le client et envoyées au serveur avec chaque demande. Les navigateurs limitent la taille des cookies. Par conséquent, seulement 4 096 octets maximum sont admis avec certitude.
Lorsque les données sont enregistrées sur le client, la méthode Page_Load du fichier cookies1.aspx vérifie si le client a envoyé un cookie. Si ce n'est pas le cas, un nouveau cookie est créé, initialisé et enregistré sur le client :
protected void Page_Load(Object sender, EventArgs e) {
if (Request.Cookies["preferences1"] == null) {
HttpCookie cookie = new HttpCookie("preferences1");
cookie.Values.Add("ForeColor", "black");
...
Response.AppendCookie(cookie);
}
}
Protected Sub Page_Load(sender As Object, e As EventArgs)
If Request.Cookies("preferences1") = Null Then
Dim cookie As New HttpCookie("preferences1")
cookie.Values.Add("ForeColor", "black")
...
Response.AppendCookie(cookie)
End If
End Sub
protected function Page_Load(sender:Object, e:EventArgs) : void {
if (Request.Cookies("preferences1") == null) {
var cookie:HttpCookie = new HttpCookie("preferences1");
cookie.Values.Add("ForeColor", "black");
...
Response.AppendCookie(cookie);
}
}
|
|
C#
|
VB
|
JScript
|
|
Sur la même page, une méthode GetStyle est utilisée à nouveau pour fournir les différentes valeurs enregistrées dans le cookie :
protected String GetStyle(String key) {
HttpCookie cookie = Request.Cookies["preferences1"];
if (cookie != null) {
switch (key)
{
case "ForeColor" : return cookie.Values["ForeColor"]; break;
...
}
}
return "";
}
Protected Function GetStyle(key As String) As String
Dim cookie As HttpCookie = Request.Cookies("preferences1")
If cookie <> Null Then
Select Case key
Case "ForeColor"
Return(cookie.Values("ForeColor"))
Case ...
End Select
End If
Return("")
End Function
protected function GetStyle(key:String) : String {
var cookie:HttpCookie = Request.Cookies("preferences1");
if (cookie != null) {
switch (key)
{
case "ForeColor" : return cookie.Values("ForeColor"); break;
...
}
}
return "";
}
|
|
C#
|
VB
|
JScript
|
|
Vérifiez que l'exemple fonctionne correctement en ouvrant la page cookies1.aspx et en modifiant les préférences. Ouvrez la page dans une autre fenêtre. Elle doit appliquer les nouvelles préférences. Fermez toutes les fenêtres du navigateur et ouvrez à nouveau la page cookies1.aspx. Le cookie temporaire doit être supprimé et les valeurs de préférence par défaut doivent être restaurées.
Pour qu'un cookie soit conservé entre les sessions, la propriété Expires de la classe HttpCookie doit avoir pour valeur une date future. Le code suivant de la page customization.aspx est identique à l'exemple précédent, à l'exception de l'assignation de Cookie.Expires :
protected void Submit_Click(Object sender, EventArgs e) {
HttpCookie cookie = new HttpCookie("preferences2");
cookie.Values.Add("ForeColor",ForeColor.Value);
...
cookie.Expires = DateTime.MaxValue; // Never Expires
Response.AppendCookie(cookie);
Response.Redirect(State["Referer"].ToString());
}
Protected Sub Submit_Click(sender As Object, e As EventArgs)
Dim cookie As New HttpCookie("preferences2")
cookie.Values.Add("ForeColor",ForeColor.Value)
...
cookie.Expires = DateTime.MaxValue ' Never Expires
Response.AppendCookie(cookie)
Response.Redirect(State("Referer").ToString())
End Sub
protected function Submit_Click(sender:Object, e:EventArgs) : void {
var cookie:HttpCookie = new HttpCookie("preferences2");
cookie.Values.Add("ForeColor",ForeColor.Value);
...
cookie.Expires = DateTime.MaxValue; // Never Expires
Response.AppendCookie(cookie);
Response.Redirect(State("Referer").ToString());
}
|
|
C#
|
VB
|
JScript
|
|
Vérifiez si l'exemple fonctionne correctement en modifiant une valeur, en fermant toutes les fenêtres du navigateur et en ouvrant à nouveau cookies2.aspx. La fenêtre doit toujours afficher la valeur personnalisée.
Utilisation de ViewState
Cet exemple illustre l'utilisation de la propriété ViewState pour enregistrer des valeurs propres à la demande.
ASP.NET fournit la notion, côté serveur, d'un état d'affichage pour chaque contrôle. Un contrôle peut enregistrer son état interne entre les demandes à l'aide de la propriété ViewState d'une instance de la classe StateBag. La classe StateBag fournit une interface de type dictionnaire pour enregistrer les objets associés à une clé de chaîne.
Le fichier pagestate1.aspx affiche un panneau visible et enregistre son index dans l'état d'affichage de la page avec la clé PanelIndex :
protected void Next_Click(Object sender, EventArgs e ) {
String PrevPanelId = "Panel" + ViewState["PanelIndex"].ToString();
ViewState["PanelIndex"] = (int)ViewState["PanelIndex"] + 1;
String PanelId = "Panel" + ViewState["PanelIndex"].ToString();
...
}
Protected Sub Next_Click(sender As Object, e As EventArgs)
Dim PrevPanelId As String = "Panel" + ViewState("PanelIndex").ToString()
ViewState("PanelIndex") = CType(ViewState("PanelIndex") + 1, Integer)
Dim PanelId As String = "Panel" + ViewState("PanelIndex").ToString()
...
End Sub
protected function Next_Click(sender:Object, e:EventArgs) : void {
var PrevPanelId:String = "Panel" + ViewState("PanelIndex").ToString();
ViewState("PanelIndex") = int(ViewState("PanelIndex") + 1);
var PanelId:String = "Panel" + ViewState("PanelIndex").ToString();
...
}
|
|
C#
|
VB
|
JScript
|
|
Remarquez que si vous ouvrez la page dans plusieurs fenêtres du navigateur, chaque fenêtre affiche d'abord le panneau contenant son nom. Chaque fenêtre peut naviguer de manière indépendante entre les panneaux.
- Utilisez des variables d'état de l'application pour enregistrer des données rarement modifiées, mais souvent utilisées.
- Utilisez des variables d'état de session pour stocker des données propres à une session ou à un utilisateur. Les données sont enregistrées intégralement sur le serveur. Utilisez ces variables s'il s'agit de données à vie courte, volumineuses ou sensibles.
- Enregistrez de petites quantités de données volatiles dans un cookie non persistant. Les données sont enregistrées sur le client, envoyées au serveur à chaque demande et expirent une fois l'exécution du client terminée.
- Enregistrez de petites quantités de données non volatiles dans un cookie persistant. Les données sont enregistrées sur le client jusqu'à ce qu'elles expirent et sont envoyées au serveur à chaque demande.
- Enregistrez de petites quantités de données propres à la demande dans l'état d'affichage. Les données sont envoyées du serveur au client, et inversement.
|