Est-il de meilleures pratiques et de l'alternative recommandée pour les variables de Session dans MVC
Bon, alors tout d'abord avant que quelqu'un ne tente de faire une détermination que c'est un "double" question; j'ai étudié la plupart des messages sur DONC en ce qui concerne des questions similaires, mais même dans l'ensemble de tout ce qui a été dit, je suis encore un peu un dilemme quant à l'définitif ou peut-être devrais-je dire à un accord unanime sur ce.
Je peux cependant dire que j'ai (basé sur les poteaux) déterminer de façon concluante que la réponse est basée sur la portée de l'obligation. Mais même en tenant compte de cela, les opinions semblent trop complexes pour moi de prendre une décision quant à savoir comment je dois gérer cela.
Mon besoin immédiat est que j'ai besoin de persister les données de la variable à partir de 1 contrôleur à travers de nombreux points de vue. Plus précisément, j'ai un contrôleur et la vue correspondante qui gère le panier le nombre d'éléments et je voudrais persistent que les données à travers de multiples points de vue. Je pense que le _layout point de vue est le choix le plus logique pour cela.
Maintenant, j'ai réussi à accomplir cette tâche en assignant la valeur d'une variable de Session qui est extrait de mon _layout vue; ainsi, même lorsque l'utilisateur pour naviguer n'importe où à l'intérieur du site, le nombre d'articles dans le Panier va persister jusqu'à ce qu'ils quittent le site ou la validation de votre commande; dans ce cas, la variable sera effacé dans le code.
Les postes que j'ai lu semble biaisé à rester à l'écart de variables de Session en faveur de Cookies et de stockage des données dans une base de données ou en indiquant que pour le but pour but que je me propose de les utiliser, les variables de Session sont parfaitement bien à utiliser.
L'autre chose que j'ai lu suggère que les variables de Session peuvent potentiellement entraver la performance globale si il y a un trafic élevé sur le site étant donné que l'information est stockée sur le serveur.
Personnellement, je ne peut pas justifier le stockage de ce type d'information dans une base de données et ensuite frapper la base de données que j'imagine que cela pourrait également affecter les performances du site et il semble un peu exagéré pour le stockage de données temporaires. TempData, ViewData et ViewBag ne fonctionnent pas dans la persistance des données, de sorte qu'ils ne sont pas choix logique pour l'exigence de l'OMI.
Si il y a un autre bien adapté alternative à la variable de Session (qui travaille pour moi) je voudrais savoir ce que c'est.
De 2 messages qui semblent contradictoires dans l'effort de fournir les meilleures recommandations laissez-moi un peu confus.
Semble que cette question (bien que présentés dans de nombreuses variantes) n'a pas de réponse définitive que je peux conclure.
Si il est plus préférable pour ce faire, sans exagéré, alors que c'est la réponse que je suis à la recherche d'.
J'ai lu quelque part l'utilisation de MVC filtres en tandem avec le Global.ascx démarrage de l'application de la section en tant que bien, mais cela ne semble pas approprié pour les variables définies au niveau du contrôleur autant que peut-être, les variables statiques.
Quelqu'un peut peut-être squash (par manque d'un meilleur mot) le grand nombre d'opinions diverses sur le sujet et peut-être donner plus de réponse définitive à la question? Je suis sûr que la diversité des opinions ont leur place et je ne suis pas tenter de les discréditer. Mais ayant un caractère définitif, et éventuellement de réponse unanime serait mieux; ensuite, j'ai pu faire le tri entre les messages d'autres afin de déterminer ce qui est le mieux pour mon application.
Bien sûr, si cette question n'a pas de réponse définitive; dites-le moi et je vais tenter de dériver ma propre réponse à partir des autres postes.
Grâce
===========================================================
MISE À JOUR DE LA RÉPONSE AUX RÉPONSES FOURNIES
La mise en cache et les Cookies semblent être une préférence générale à partir des réponses mais j'ai aussi pris note de la déclaration que la mise en cache pas un candidat idéal pour une utilisation sur plusieurs serveur web parce que la synchronisation peut être un problème potentiel.
De donner du crédit à Tim, il a déclaré que la Base de données de stockage est optimisé et les utilisateurs ont la possibilité de revenir à un moment plus tard et continuer là où ils l'avaient laissé.
Qui est un excellent point, mais en gardant la prospective sur les probabilités, il est probable raisonnable étant donné que certains utilisateurs ne peuvent pas retourner en laissant inutile de données dans la base de données.
Donc garder l'DB optimisé et propre (ce qui "me" est d'égale pertinence) nécessiterait la mise en œuvre d'une tâche de maintenance expire automatiquement ces enregistrements en fonction d'un seuil fixé de temps pour tenir compte de ces circonstances. Bien qu'une tâche de maintenance n'est pas une incontestable option, je pense toujours que cela ajoute juste un peu plus de travail à la tâche tout simplement de l'intention qui servait de stockage temporaire.
Néanmoins, je ne l'égard de Tim recommandation et nous croyons qu'il mérite le mérite sur la lutte contre mon avis initial à un diplôme; qu'une base de données ne semble pas être une option viable pour le stockage Temporaire de données; donc je pense que le compromis serait de stocker les données dans une base de données (dans le scénario d'un Panier d'achat ou similaire) peut-être qu'après une extraction. De cette façon, comme vous l'avez dit précédemment, les données peuvent être constamment suivis lors de visites ultérieures si vous avez un enregistrement des transactions. Mais plus important encore, il serait de données de ces transactions à avoir une véritable pertinence de persister à la base de données.
Il a également été indiqué que, bien que la Session est plus rapide que la Base de données; mais malgré avoir ses avertissements qui peuvent dans une certaine mesure atténué par d'autres mécanismes comme levier de la SessionStateBehavior attribut, que de servir comme un exemple.
... MAIS je crois que Erik type de conduit au point de départ avec le Dunning-Kruger Effet. Même si, du contenu et des explications pour des propositions de réponses ici; je doute sérieusement de l'expertise de l'une des personnes qui ont répondu est de toute façon discutable. Néanmoins, j'ai tendance à être d'accord sur le fait d'obtenir un avis unanime peut être un peu plus élevé que l'attente raisonnable de ma part.
Ce que j'ai été plus spécifiquement à la recherche d'un consensus général pour une technique qui permettrait d'accueillir confortablement un grand nombre de scénarios. En d'autres termes, quelque chose qui pourrait l'accueillir, non seulement mon scénario en particulier, mais aussi de fournir l'élément d'évolutivité pour les plus grands environnements potentiellement plus lourds de la circulation. De cette façon, un changement dans la programmation serait atténué tout à fait ou minime, au mieux.
==================================================
Résumé sur la base des commentaires:
-
Les variables de Session semblent accueillir les petits scénarios et, le cas échéant, mais ils ont un certain potentiel de persistance des inquiétudes parmi les autres notables divergences comme l'a déclaré très thorougly par Erik. Ainsi, cette option ne sera évidemment pas s'adapter à un modèle évolutif.
-
La mise en cache est préférable par rapport à des variables de Session mais encore une fois pas impérativement le "meilleur" évolutive option en raison, entre autres, le potentiel de synchronisation de complexités dans le serveur web de la ferme des environnements comme on l'a déjà souligné. Mais une option néanmoins.
-
Stockage de base de données est évolutive mais pour l'intention le but de temporaire de stockage volatile est probablement pas le plus élégant de l'option à partir d'une base de données de point de vue, car cela nécessiterait de périodiques de nettoyage. Personnellement, avoir une base solide dans les concepts de base de données plus tôt dans ma carrière, c'est probablement ne va pas être quelque chose que beaucoup de développeurs sera sans doute d'accord avec, mais à l'aide de la base de données à cette fin peut suffire pour le Développement Web à partir d'un des programmeurs de point de vue; cependant, du point de vue de la DAL et de la DB de développement de la ce (pour moi) a le potentiel pour mandater une supplémentaire DB tâche de mettre en œuvre un efficace backend.
-
Cookies semblent être une option agréable d'avoir le combiné "souhaitable" éléments variables de Session et la mise en cache.
==================================================
CONCLUSION
Sur la base des réponses; je pense que les COOKIES et le CACHE semblent généralement bien arrondi propositions pour des meilleures pratiques à travers le conseil d'administration en combinaison avec la base de données de stockage lors de la persistance est nécessaire après le fait; comme potentiellement de bons candidats pour l'évolutivité de ceux présentés.
Le choix ultime entre les 2 semble être basée sur la quantité et le type de données nécessitant de stockage (par exemple, sensibles vs non-sensibles et si oui ou non il y a aucun souci que le client peut modifier les données de leur fin); en plus des considérations spéciales pour les COOKIES dans le fait qu'ils peuvent être désactivés par les clients.
Évidemment, il n'existe pas de solution unique pour tous comme l'a clairement souligné et en a conclu que les réponses fournies, mais en termes d'évolutivité; j'ai peut-être tort, mais ils semblent être le MEILLEUR choix disponible.
Parce que toutes les réponses sont bonnes, je suis assez d'aller à crédit tous les postes utile et va accepter d'Erik répondre en tant que bien arrondi globale d'une solution évolutive. Je souhaite que je pourrais sélectionner plus d'une réponse que je crois à la Tim de réponse a également été très bien préparé et concis.
Gupta réponse a été bon aussi, mais je voulais plus de l'élaboration de la réponse proposée et non pas une répétition de messages précédents.
Merci Les Gars!
- J'aime bien cette question, bien qu'il pourrait être plus adaptée à Programmeurs.
- Merci, c'était vraiment utile pour moi comme je suis actuellement umming et aaahing sur la question de stocker une valeur unique dans une session,cookie ou autre chose. Dans mon cas, lorsqu'un utilisateur se connecte sur mon site, ils sont retournés non identifiable valeur qui a besoin de la persistance à un non-intensif site.
- Une autre solution possible, ce qui est plus possible aujourd'hui qu'elle ne l'était lorsque cette question a été posée la première fois, est HTTP 5 local de stockage. C'est maintenant beaucoup plus largement pris en charge (bien que vous pouvez toujours courir dans des problèmes avec certains navigateurs mobiles, et bien sûr, les gens toujours très vieux navigateurs de bureau).
Vous devez vous connecter pour publier un commentaire.
Vous n'obtiendrez jamais l'unanimité de l'opinion sur quoi que ce soit dans n'importe quel grand groupe de personnes. C'est juste la nature humaine. Partie des qui vient de la Dunning-Kruger Effet qui stipule que le moins que quelqu'un sait sur un sujet, plus il est probable qu'ils sont à plus de valeur de leur expertise dans ce sujet. En d'autres termes, beaucoup de gens pensent qu'ils savent quelque chose, mais seulement parce qu'ils ne savent pas qu'ils ne le savent pas. Partie, c'est simplement que les gens ont des expériences différentes, et certains n'ont pas trouvé de problèmes avec la session, tandis que d'autres sont dans des situations diverses, ou vice-versa...
Donc, pour la sauvegarde de votre recherche, ce qui suggère que la réponse dépend fortement des exigences, nous avons besoin de comprendre ce que vos exigences. Si c'est pour être un haut trafic du site, avec équilibrage de charge des serveurs dans une batterie de serveurs web, puis de rester aussi loin de la session que vous le pouvez. Bien sûr, il est possible de partager session de diverses manières dans un environnement de batterie de serveurs (serveur de session, distribuer serveur de cache, etc..), mais en évitant de session sera presque toujours être plus rapide si vous pouvez l'aider.
Si votre site est un serveur unique, et peu susceptible de croître au-delà. Et votre modèle de trafic est relativement faible, alors la session peut être une option utile. Cependant, vous devez toujours être conscient que la session n'est pas fiable de stockage, et peut disparaître à tout moment. Si le pool d'applications est recyclé, la session est allé. Si une exception non interceptée les bulles du processus de travail, la session peut-être disparu. Si IIS pense qu'il y a pas assez de mémoire, votre session est peut-être parti, indépendamment de toutes les valeurs de délai configuré. Vous aussi vous ne pouvez pas toujours obtenir une déclaration fiable qu'une session est terminée, depuis les sessions fermées ne déclenche pas l'événement Session_End.
Un autre problème est que la Session est sérialisé. En d'autres termes, IIS empêche plus d'un fil de l'écriture à la session à la fois, et il fait souvent ce par le verrouillage de la session alors qu'un thread est en cours d'exécution si elle n'a pas choisi d'en écriture verrouillage de session. Cela peut causer de graves problèmes dans certains cas, et seulement de faibles performances dans les autres. Vous pouvez réduire ce en marquant les différentes méthodes de lecture seule attribut de session si vous n'allez pas être en le modifiant dans la méthode.
En fin de compte, si vous ne choisissez d'utiliser la session, alors essayez de ne l'utiliser que pour les petits, à court vécu des choses si possible, et si pas possible alors de construire un moyen de se "régénérer" les données si la session est perdue. Par exemple, à l'aide de votre nombre d'articles dans le panier exemple, vous pourriez écrire une méthode qui vérifie d'abord si la valeur est là, et si non, il va et charges à partir de la base de données. Toujours utiliser cette méthode pour accéder à la variable, plutôt que d'y accéder directement à partir de la session... de cette façon, si la session est perdu, il suffit de le recharger.
Toutefois, ceci dit... Pour le nombre d'éléments dans un panier, je préfère généralement utiliser un cookie pour cette information, puisque les témoins se passait à la page sur chaque chargement de toute façon, et c'est une petite unité discrète de données. Préfèrent généralement de Session pour les données sensibles que vous souhaitez empêcher l'utilisateur d'être en mesure de changer.. nombre d'articles dans le panier tout simplement ne correspond pas à cette règle.
Quand
Les bases de données sont hautement optimisé. Une valeur simple comme un panier comte est un bon candidat pour la mise en cache de la base de données et (espérons-le) à bas prix pour calculer directement. Il peut être un non-problème.
Toutefois, si vous avez exclu d'autres mécanismes, petit, utilisateur par utilisateur, les valeurs sont candidats viables pour la session.
Cache
est bien pour le site de l'échelle des valeurs, ou à l'utilisateur les valeurs avec les touches uniques. Cependant, la synchronisation des caches sur plusieurs serveurs web peut être difficile. En dehors du processus de l'état de session va rester synchronisés car il est stocké dans un emplacement unique (base de données ou d'un serveur d'état).Bien sûr, il y a beaucoup de 3ème partie de la mise en cache des solutions de rechange avec diverses options afin de les garder synchronisés.
Indépendamment de l'endroit où le nombre est stocké temporairement, je suis d'avis que les chariots eux-mêmes devraient être stockées dans la base de données afin que les utilisateurs ont la possibilité de revenir plus tard et de continuer là où ils l'avaient laissé.
Performance
Si vous utilisez de processus de l'état de session (par exemple, dans une charge équilibrée de l'environnement et/ou de session plus résistant), il sera frappé d'une base de données ou d'appeler un processus de service, mais l'appel est relativement bon marché, à moins que vous êtes la sérialisation de grands graphes d'objets.
Session est chargé une fois par demande. Ultérieure de l'accès en lecture est très rapide.
Écrit à la session peut être préjudiciable à la performance, même lorsqu'il n'y a pas de charge. Pourquoi? la plupart des applications modernes utilisent des appels asynchrones, et lorsque plusieurs appels asynchrones frappé un gestionnaire HTTP (page, contrôleur, etc) qui lit/écrit session, ASP.Net verrouiller la session de sérialiser l'accès. Pour éviter cela, vous pouvez décorer vos contrôleurs avec
[SessionState( SessionStateBehavior.ReadOnly )]
Conception
Cela semble être le mélange des préoccupations, c'est à dire d'avoir le point de vue conscient de la sous-jacentes mécanisme de stockage. À partir d'un point de vue puriste, je définissez cette valeur sur un modèle d'affichage ou au moins le mettre dans le
ViewBag
. À partir d'un point de vue pratique, une ou deux valeurs extraites de cette manière ne sera probablement pas mal quoi que ce soit, mais méfiez-vous de laisser pousser beaucoup plus loin.Variables statiques ont parfaitement légitime, mais vous devez comprendre de manière approfondie, ou risque de graves problèmes.
Voir mes réponses relatives à des variables statiques dans les ASP.Net:
Session de remplacement dans différents potentiels :-
Lorsque vous garder quelque chose dans la session, il rompt la règle primaire en ASP.NET MVC. Vous pouvez utiliser ces options comme une alternative de session.
Si votre asp.net (MVC) session ne boxe unboxing sur l'objet, alors il fait un peu de charge sur le serveur. Essayez cette idée
La mise en cache :- le Stockage d'une Liste ou quelque chose comme les grandes données de la session est mieux peut tenir dans le Cache. Vous avez le contrôle sur chaque fois que vous le souhaitez à échéance plutôt que de session de l'utilisateur.
Si votre application dépend JSON/Ajax données, alors vous pouvez utiliser un certain type de fonctionnalité fournie en html5 (comme WebSQL, IndexDB). il ne sera pas utiliser le cookie de sorte que vous pouvez économiser de la charge de travail sur le serveur.