J'ai une application .NET (C #) qui va quelque chose comme ça MAINES MAINTES, si l'utilisateur 105 se connecte dans une instance d'examen TheExam est créée et attribuant à la statique. Déclaration sur le dessus. Si l'utilisateur 204 se connecte à partir d'un ordinateur différent, l'objet statique en haut est-il la valeur de 204 même sur l'ordinateur de 105 de l'utilisateur? P> P>
5 Réponses :
Non, l'objet statique est la même instance pour tout le monde connecté. De plus, l'objet ne vit pas sur l'ordinateur de 105, mais uniquement sur le serveur Web. P>
Pour clarification: les statiques sont propres au domaine de l'application, auquel cas une application Web complète. Remarque: Si vous utilisez un équilibrage de charge, ils ne sont pas uniques sur les deux serveurs +. Alors gardez cela à l'esprit pour la mise à l'échelle horizontale.
Si vous utilisez la [ThreadSticaticAttribute], chaque thread aura sa propre instance de cette variable statique.
En effet, mais les threads sont réutilisés pour différentes demandes. Ce n'est donc pas assez bon. L'utilisation de la session est la meilleure façon pour quelque chose comme ça.
Bien sûr. La session est ce qui devrait être utilisé. L'utilisation de variables statiques dans ASP.NET est une mauvaise idée. Je répondais à Aren commentant principalement que les statiques ne sont pas nécessairement propres au domaine de l'application.
Réponse courte: Oui, le champ statique est global à l'appdomain, ce faisant que cela pour qu'un utilisateur ne stipule pas sur les données d'un autre utilisateur.
Vous voulez probablement regarder à l'aide de la session stockage à la place, qui est scopé par -Utilisateur, par exemple p>
Il y a une "instance" d'un objet statique par AppDomain. Donc, la réponse à votre question est oui. Puisque vous écrasez la variable lorsque l'utilisateur 204 se connecte, la même valeur apparaîtra également pour l'utilisateur 105, également. P>
Certains conseils généraux p>
session ["examen"] = actuelUser.exam; code> li>
- Utilisez un fournisseur de profils pour persister des informations sur chaque utilisateur entre les sessions. LI>
ul>
Je pense que dire "Éviter les champs statiques dans la mesure du possible", le dépassant un peu. J'ai vu des gens qui ont littéralement peur de les utiliser parce qu'ils ne comprennent pas comment ils travaillent et que quelqu'un leur a dit qu'ils risquent de gâcher les choses. Il n'y a rien de mal à les utiliser et à faire beaucoup de choses tellement plus faciles (méthodes d'assistance, mise en cache en mémoire). Vous avez juste besoin de savoir comment les utiliser correctement.
@Matti - une méthode n'est pas un champ. Rien n'est faux avec les méthodes d'assistance. Vous avez juste besoin de savoir comment les utiliser correctement i> - convenu! :)
J'ai vu des gens qui ont peur de tout le mot clé statique code>: i
@Matti - moi aussi, mais plus dans le contexte de C / C ++ que c #
Il y a aussi un attribut [Threadstatic] dans .NET qui fera une instance statique par fil. P>
http://msdn.microsoft.com /en-us/library/system.threadsticattribute(vs.71).aspx P>
C'est bien que vous ne le mentionniez, mais dans ce cas, il serait également mauvais, car les threads sont réutilisés dans le threadpool ASP.NET.
Cependant, un thread n'est pas dédié à chaque utilisateur. Pas même une seule demande n'est garantie de rester dans le même fil du début à la fin. Donc, la filetage est principalement (sinon complètement) inutile dans des applications Web.
La durée de vie des variables statiques et des sessions utilisateur sont des concepts très différents. Les variables statiques ont une durée de vie définie par le CLR et se résume essentiellement aux 2 règles suivantes
AppDomain code> li>
- Chaque instatiation unique d'un type générique crée une variable statique différente. li>
ol>
Je trouve qu'il est difficile d'écrire la deuxième règle sans qu'il soit ambigu de unique fort>. Essentiellement mytype code> et mytype code> chacun a des variables statiques différentes. Tandis que mytype code> et mytype code> partage le même. p> L'acess de l'utilisateur à un serveur Web n'affecte pas l'une ou l'autre. p>
Si vous souhaitez avoir des données utilisateur, utilisez la session code> pour stocker les données. p> xxx pré> p>
Je ne sais pas si je fais ce droit, mais de fondamentalement ce que j'ai fait est l'examen Newexam = nouvel examen (valeur, valeur); SESSION ["SOINKEKE"] = NewExam, puis je viens de lancer la session ["Sommeille"] comme examen theexam = (Examen) Session ["EXAMEN)] afin que je puisse obtenir les objets ... est-ce la bonne façon de le faire?