web-dev-qa-db-fra.com

Le contrôleur SessionStateBehavior est en lecture seule et je peux mettre à jour la variable de session

Je suppose que si le contrôleur a l'attribut SessionStateBehavior.ReadOnly, je ne peux pas modifier les variables de session à l'intérieur de ce contrôleur , Mais je peux modifier les valeurs.

J'essaye ce code

 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    public class GLobalController : Controller
    {
      public  ActionResult Index()
        {
            Session["xxx"] = DateTime.Now.ToString();
            return View();
        }
24
user1223234

see Ecrire dans une session en lecture seule dans MVC 3+

Ce message affirme que le comportement est incohérent. Je peux certainement écrire dans Session in Controllers avec ReadOnly. 

Je le traiterais comme ceci:

  • Obligatoire signifie que vous demandez un verrou exclusif sur la session (c'est-à-dire, aucun traitement en parallèle des demandes pour le même ID de session)
  • ReadOnly signifie que vous demandez un verrou non exclusif sur la session (votre demande doit encore attendre que les demandes avec un verrou exclusif soient terminées, mais vous pouvez traiter des demandes avec des verrous non exclusifs en parallèle. que votre code n'écrit pas dans Session, il n'est pas forcément appliqué par le framework)

    Je réalise que cela va à l’encontre de http://msdn.Microsoft.com/en-us/library/system.web.sessionstate.sessionstatebehavior.aspx

    L'état de session en lecture seule est activé pour la demande. Cela signifie que l'état de la session ne peut pas être mis à jour.

    mais il semble que vous puissiez réellement mettre à jour l'état de la session dans certains scénarios.

  • 27
    turnhose

    Selon Patrick Y. Ng (ingénieur logiciel chez Microsoft) qui a conçu et développé le moteur Session State de ASP.NET:

    Même si EnableSessionState est marqué en tant que ReadOnly, dans l'état InProc, l'utilisateur peut toujours modifier la session. La seule différence est que la session ne sera pas verrouillée pendant la demande. Cette limitation est de par leur conception. Et je suis désolé que ce ne soit pas documenté dans MSDN.

    Il y a beaucoup plus d'informations utiles sur l'état de session dans ce post . Cela vaut vraiment la peine d'être lu.

    1
    piter entity

    Ceci est juste mon interprétation:

    Je vois que vous pouvez ajouter à Session au cours de la méthode d'action. Après tout, Session n'est qu'un dictionnaire. Cependant, la session n'est pas enregistrée à la fin.

    Il semble bien que cela devrait constituer une exception, mais peut-être puisque cette fonctionnalité est apparue plus tard dans le cadre, ils ont décidé de ne pas vérifier à chaque fois.

    Les résultats peuvent également varier en fonction du stockage d’état de session que vous utilisez (serveur inproc/sql).

    0
    Simon_Weaver