Je viens d'implémenter un gestionnaire qui utilise IReadOnlySessionState et je me demandais pourquoi cette interface de marqueur est nécessaire. (Je comprends qu'il est nécessaire pour accéder aux variables de Session, ma question est pourquoi est-ce du point de vue d'un concepteur de framework) Je pense que c'est pour que les gestionnaires soient aussi minces que possible, les obligeant à "opt-in" si ils veulent utiliser l'état de session, mais je me demande s'il me manque peut-être autre chose.Justification derrière IReadOnlySessionState
Répondre
Oui, AFAIK, vous avez raison. Les deux IReadOnlySessionState
et IRequiresSessionState
sont des interfaces de marqueur qui vous protègent contre le fait que votre gestionnaire soit plus lourd et plus lent.
La différence entre eux est seulement l'état d'écriture de la session.
Vous avez raison. L'interface IReadOnlySessionState
vous donne simplement la possibilité d'utiliser l'objet Context.Session. Si vous implémentez l'interface IRequiresSessionState
, votre gestionnaire place un verrou exclusif sur la session en cours, de sorte que toutes les autres demandes (qui souhaitent utiliser l'objet Session) dans le contexte de la même session attendent que votre gestionnaire se termine.
IReadOnlySessionState
n'est pas un très bon nom, car en fait vous pouvez modifier SessionState dans de tels gestionnaires et vous n'obtiendrez pas d'exception. Vous prenez simplement la responsabilité de problèmes concurrents sur vous.
Je pensais que l'affirmation était que si vous définissez IReadOnlySessionState, vous pouvez apporter des modifications (par exemple, Session ["x"] = 3) et ces changements "colleraient", affectant les futurs accès de Session ["x"] - le seule différence étant d'éviter que le verrou exclusif soit retiré. Cependant, j'ai de la difficulté à reproduire cela; IReadOnlySessionState vous permet d'apporter des modifications à la session sans voir d'exception, mais les modifications semblent être oubliées une fois le gestionnaire terminé. Si l'affirmation est que les changements * sont * respectés, y a-t-il des conseils à reproduire? – Chris
Je l'ai reproduit sans problème. Créez le projet asp.net, dans Default.aspx ajoutez '<% = Session [" t "]%>' – renadeen
@Chris Je l'ai reproduit sans problème. Créez un projet asp.net, ajoutez '<% = Session [" t "]%>' au balisage de Default.aspx, définissez EnableSessionState = "true", ajoutez 'Session [" t "] = ((int) (Session [ "t"] ?? 1)) + 1; 'à Default.aspx.cs (dans Page_Load), lancez le site et actualisez la page plusieurs fois. Le compteur incrémentera chaque rafraîchissement. (Je ne savais pas que je peux éditer le commentaire pendant cinq minutes Très ennuyeux.) – renadeen
Voir aussi http://stackoverflow.com/questions/8039014/irequiressessionstate-vs-ireadonlysessionstate/12504420 – Chris
double possible de [IRequiresSessionState vs IReadOnlySessionState] (https://stackoverflow.com/questions/8039014/irequiressessionstate-vs- ireadonlysessionstate) – Nisarg