2

Je m'excuse si cela a déjà été demandé, mais je n'ai pas vraiment trouvé la question spécifique que j'ai dans ma tête.Alternatives à l'utilisation de variables de session dans ASP.NET (y compris MVC)

Pour le site que je construis (en utilisant ASP.NET MVC) - la performance est une caractéristique importante. En outre, il est possible que le site soit hébergé dans un environnement où le pool d'applications est recyclé toutes les 20 minutes (ou plus tôt si le seuil de mémoire est atteint). Je voudrais être complètement indépendant de compter sur des variables de session et à la place, stocker une valeur de type GUID dans un cookie. Mon raisonnement est - je ne sais pas combien de temps durera la session à cause du recyclage d'AppPool et je ne veux pas que leur session expire prématurément et les oblige à se connecter à plusieurs reprises.

La valeur GUID dans le cookie servirait de clé de recherche à une table où je stocke des informations de type session (une valeur d'ID utilisateur, etc.). Donc, si j'avais besoin de ces données, je pourrais les récupérer dans la base de données. Je ferais toujours usage de l'événement Session_OnEnd pour effacer cette table de lignes de session avec une valeur de "dernière activité" de plus de 20 minutes (ou si les sessions longues sont configurées pour durer). Donc, je suppose que je serais encore en train d'utiliser l'état de la session, mais pas les variables de la session.

Mon souci, encore une fois, concerne les performances. Par conséquent, j'étais curieux de savoir s'il existe de meilleures méthodes pour éviter l'utilisation des variables de session tout en conservant la capacité de savoir qui est l'utilisateur et de gérer ses visites sur le site de manière «sessionnelle». Je suis encore un débutant à MVC, mais j'ai beaucoup d'expérience dans ASP.NET au cours des années, donc j'espère que ma question est logique! EDIT: Je ne veux pas utiliser l'état de session SQL car je serai probablement dans un environnement d'hébergement de serveur sql partagé et je ne pense pas que j'aurai une connexion avec la possibilité de créer/exécuter des jobs si nécessaire pour la suppression des données de session sql expirées, etc. Y a-t-il des inconvénients réels à dépendre de Session_OnEnd avec un cookie dans le scénario de recyclage d'AppPool? Session_OnEnd ne peut-il pas s'exécuter pour les sessions en cours lors de la recycle d'AppPool?

Répondre

5

Vous assumez Les sessions ne sont stockées dans le processus de travail, vous pouvez avoir des sessions SQL État, check this link before going any further

+1

Dans le cas contraire connu sous le nom de SQL et Cookies. – madcolor

+0

+1: vous n'avez pas à rouler votre propre base de données si vous allez avec la persistance de l'état SQL –

+0

http://www.dbazine.com/sql/sql-articles/cook9 – madcolor

1

En utilisant une base de données pour assurer la persistance « durable » dans les fermes web/jardins est une technique courante. Il existe également distributed caching systems qui peut être utilisé pour rendre les données d'état de session disponibles sur les serveurs et redémarrer. Par exemple, l'un des systèmes répartis que j'ai vus utilise UDP pour partager des données de session sur plusieurs serveurs. Je m'attendrais à ce qu'il y ait un avantage de performance avec le cache distribué car les données sont stockées en mémoire sur les serveurs, donc il n'y a pas de recherche de base de données.

1

Si vous ne pouvez pas utiliser l'état in-process, vous devrez revenir à un référentiel externe, qui sera probablement la base de données. Alors, pourquoi ne pas avoir stocké l'état de la session dans la base de données? Il existe un support intégré pour cela, et il résout efficacement le problème de recyclage, tout en conservant une performance acceptable si l'état de la session est réduit.

+0

"l'état de la session est maintenu petit" - quelle est votre définition de cela? Le nombre de variables de session inférieur à 2? dix? – jamauss

+0

Pas le nombre absolu, mais leur type. Quand ils ne sont pas en cours, ils doivent être sérialisables, donc vous devriez faire attention à ce que le graphe d'objet sérialisé soit petit. – Lucero

+0

Je n'utiliserais que des types simples - String, DateTime, Int, etc. Quels sont tous les types sérialisables, non? – jamauss

0

Regardez dans un mécanisme de mise en cache personnalisé. Comme vous l'avez dit, vous ne pouvez pas utiliser les variables de session car il semble que votre site Web sera équilibré? Les sessions peuvent changer en raison du recyclage hors de la piscine d'applications. Vous ne voulez pas non plus la tête de View State (vous pouvez l'utiliser mais cela aura un impact sur les performances).

Il y a trois principales différences entre caching et les autres modèles mentionnés:

  1. Caching thread-safe
  2. articles dans le cache sont automatiquement supprimés
  3. Articles dans les dépendances de support de cache
Questions connexes