Etat de visualisation côté serveur ASP.NET
-
20-08-2019 - |
Question
J'ai lu des méthodes pour stocker viewstate sur le serveur:
Mais ils sont en quelque sorte compliqués. Je cherche un moyen de persister un objet sans avoir à le sérialiser. Je pourrais utiliser l'état de session, mais si un utilisateur ouvre plusieurs fenêtres, l'objet pourrait être écrasé.
Existe-t-il une solution simple à ce problème?
La solution
Dans cette situation, je mettrais l'objet dans la session en utilisant une clé unique et lierais la clé à la page. Tout cela peut être résumé dans les propriétés de la classe de page.
public string PersistanceKey
{
get {
if(ViewState["PersistanceKey"] == null)
ViewState["PersistanceKey"] = "Object" + Guid.NewGuid().ToString();
return (string)ViewState["PersistanceKey"];
}
}
public PersistanceObject Persistance
{
get {
if(Session[this.PersistanceKey] == null)
Session[this.PersistanceKey] = new PersistanceObject();
return (PersistanceObject)Session[this.PersistanceKey];
}
Les différentes clés de session autoriseraient différents objets page par page. Alternativement, au lieu d'utiliser l'objet Session, vous pouvez envisager d'utiliser le cache de l'application (l'objet Cache) pour supprimer automatiquement les entrées obsolètes de la mémoire, mais cela comporte ses propres réserves.
Il convient de noter que les avertissements de Joel sur sa réponse concernant l'utilisation de la mémoire sont tout à fait exacts. Ce n'est peut-être pas la meilleure idée pour les scénarios avec objets à faible mémoire, à forte utilisation ou à grande persistance.
Autres conseils
Je cherche un moyen de conserver un objet sans le sérialiser.
Faites attention à cela. Cela aura un impact considérable sur l'utilisation de la mémoire sur votre site. L'utilisation de la mémoire est souvent le principal obstacle à l'évolutivité.
Attribuez un numéro à chaque fenêtre que l'utilisateur peut ouvrir. Ajoutez ce numéro à la clé de session. Vous devez également stocker le numéro quelque part dans la page (chaîne de requête ou entrée masquée) pour pouvoir récupérer la variable de session appropriée.