45 votes

Remplacement complet de la session ASP.Net

ASP.Net session parfait pour un traditionnel Formulaires web app, mais ils font des choses qui sont un problème sérieux pour un moderne, l'AJAX et l'application MVC.

Plus précisément il y a seulement 3 façons d'accéder à la ASP.Net fournisseur de:

  1. Verrouillage de lecture et d'écriture (par défaut) - la session est verrouillée de l' AcquireRequestState de tir jusqu' ReleaseRequestState des incendies. Si 3 les demandes se produire à partir de votre navigateur une fois qu'ils vont en file d'attente sur le serveur. C'est la seule option dans MVC 2, mais MVC 3 permet...

  2. Non-verrouillage en lecture seule - la session n'est pas fermée, mais ne peut pas être enregistré. Cela semble être peu fiables si, comme certains le lit semble verrouiller la session à nouveau.

  3. Session handicapés - toute tentative de lecture ou d'écriture à la session déclenche une exception.

Cependant moderne avec une application MVC, j'ai beaucoup d'AJAX événements qui se produisent à la fois - je ne veux pas la file d'attente sur le serveur mais je ne les voulez être en mesure d'écrire à la session.

Ce que je veux, c'est un quatrième mode: Sale de lecture, d'écriture dernières victoires

Je pense (heureux d'être corrigé) que la seule façon de le faire est de remplacer complètement ASP.Net's sessions. Je peux écrire mon propre fournisseur, mais l'ASP sera toujours appeler à l'une des 3 structures qu'elle soutient. Est-il possible de faire ASP.Net le soutien de l'accès concurrentiel optimiste?

Cela me laisse le remplacement de tous les appels à la session avec une nouvelle classe qui se fait de la même chose, mais n'a pas de lock - ce qui est une douleur.

Je veux garder autant de la session en cours des trucs que je peux (plus significativement Id de session dans divers journaux) avec le minimum de code de remplacement. Est-il possible de faire cela? Idéalement, je voudrais HttpContext.Current.Session pour le point à ma nouvelle classe, mais sans ASP.Net verrouillage de toutes les demandes.

Quelqu'un a déjà fait quelque chose comme cela? Il semble étrange qu'avec tous les AJAXey MVC applications c'est un nouveau problème avec l'ASP.

11voto

Aristos Points 40367

Tout d'abord, je dis que MS asp.net ont de verrouillage dans le noyau de asp.net le traitement d'une page" de la session, quelque part dans le "webengine4.dll" dll pour asp.net 4

Et je dis qu'à partir du point de vue de MS asp.net act correct and lock the session this way parce que asp.net ne peut pas savoir de quel type d'informations que nous conservons sur la session peut donc faire une correcte "de la dernière écriture gagne".

Aussi correcte est la serrure de la session à la page parce que de cette façon est donne à votre très important synchronisations de votre programme, qu'à partir de l'expérience maintenant, je dis que vous en avez besoin pour la plupart de vos actions. Après j'ai remplacer la mme session avec le mien, sur l'ensemble de mes actions, j'ai besoin de faire de verrouillage global, ou bien j'ai des problèmes avec inserts double, double actions, etc.

Je donne un exemple de la question que je reconnais ici. Les données de Session sont enregistrés sur SessionSateItemCollection qui est une liste de clés. Lors de la session de la lecture ou de l'écriture de cette collection est de le faire tous ensemble. Alors, voyons ce cas.

nous avons arbre des variables de session, "VAR1", "VAR2", "VAR3"

Page 1.
getsession (réellement obtenir toutes les données et de les placer sur la liste)
session[VAR1] = "data1";
savesession()
le résultat est VAR1=data1, VAR2=(dernières données de var2), VAR3=(dernières données de var3)

Page 2.
getsession (réellement obtenir toutes les données et de les placer sur la liste)
session[VAR2] = "data2";
savesession()
le résultat est VAR1=(dernières données de var1), VAR2=2, VAR3=(dernières données de var3)

Page 3.
getsession (réellement obtenir toutes les données et de les placer sur la liste)
session[VAR3] = "data3";
savesession()
le résultat est VAR1=(dernières données de var1), VAR2=(dernières données de var2) VAR3="data3"

Notez ici que chaque page a un clone de données, tels qu'il les a lus à partir de la session en moyenne (par exemple, comme ils durent lues à partir de la base de données)

Si nous laissons ce 3 pages courir avec verrouillage, nous n'avons pas réellement lecture sale, de néant "de la dernière écriture gagne" - Ce que nous avons ici est "la dernière écriture de détruire les autres", parce que si vous pensez à nouveau, quand VAR1 changement, pourquoi le VAR2 et VAR3 rester le même ? que faire si vous avez changer VAR2 quelque part d'autre.

et pour cette raison nous ne pouvons pas laisser cela avec verrouillage tel qu'il est.

Et maintenant, l'imagerie avec 20 variables... totalement mess.

Solutions possibles

En raison de la multithread de asp.net de nombreuses piscines, la seule façon de garder les mêmes données sur les piscines et sur les ordinateurs est d'avoir une base de données commune ou d'une commune à tous les processus de programme comme le asp.net Service de l'Etat.

- Je choisir pour avoir une base de données commune comme plus facile que de créer un programme à proposer.

Maintenant, si nous nous connectons un cookie que nous faisons, à l'utilisateur à l'utilisateur des données de la session, et de contrôler les données à l'aide d'un produit totalement personnalisé champ de base de données que nous savons ce que nous aimons de verrouillage, ce n'est pas, comment faire pour enregistrer ou de modifier, ou de les comparer et de garder la dernière écriture de données wins, nous pouvons faire ce travail, et de totalement désactiver la asp.net la séance d'une session générique gardien fait pour tous les besoins, mais pas fait pour gérer des cas particuliers comme celui-ci.

Peut asp.net faire ce travail sur l'avenir de presse, oui, il peut en faire un champ supplémentaire appelé sale, et sur la session sauvegarder des données, de faire une fusion de données en utilisant le champ sale, ou quelque chose comme ça, mais ne peut pas faire cela maintenant comme il est - au moins de ce que j'ai trouvé jusqu'à maintenant.
En fait SessionStateItem ont un drapeau sale sur les propriétés, mais ne pas faire de cette fusion sur la fin de l'enregistrement des données. Je vais vraiment l'amour si quelqu'un d'autre pense que pour une solution à l'existant ms asp.net l'état de session gardien, je suis à écrire ce que j'ai trouvé jusqu'à maintenant, mais ce n'est pas dire que bien sûr il n'y a aucune façon - je n'ai pas trouvé ce que c'est.

Espérons que tous aide :)

Personnalisé SessionStateModule

dans cette réponse http://stackoverflow.com/a/3660837/159270 le James après l'écriture d'un module personnalisé dit: je ne peux toujours pas croire que la coutume de la mise en œuvre de ASP.Net Session verrouille la session pour l'ensemble de la demande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X