2009-07-23 6 views
23

Est-il possible de spécifier qu'un contrôleur ou une action donné utilise l'état de session en lecture seule? Dans ASP.NET « vieux » nous avons l'habitude de faire quelque chose comme ceci:Spécification d'une session en lecture seule dans ASP.NET MVC

<%@ Page EnableSessionState="ReadOnly" %> 

Y at-il un équivalent ASP.NET MVC? Je cherche à permettre à mon application de répondre simultanément à plusieurs demandes du même client, et désactiver complètement la session n'est pas une option dans mon cas.

+0

double possible de [Etat Désactiver session par demande dans ASP.Net MVC] (http://stackoverflow.com/questions/1464203/disable-session-state-per-request-in-asp -net-mvc) – Liam

Répondre

8

Une question similaire a été posée ici: Disable Session state per-request in ASP.Net MVC

La réponse acceptée traite la création d'un gestionnaire d'itinéraire personnalisé qui ceuxci finalement se lier à la session. Cela ne répond pas exactement à votre question (c'est-à-dire comment déclarer plusieurs actions pour utiliser l'accès à une session en lecture seule), mais cela semblait assez pertinent pour être mentionné.

1

Cela pourrait être un peu difficile - je crois savoir que la configuration de l'état de la session est quelque chose qui s'est passé au niveau IHttpHandler. Avec les gestionnaires personnalisés, vous pouvez spécifier l'état de la session en utilisant des interfaces de marqueur, comme IReadOnlySessionState pour déclarer qu'il n'a besoin que d'un état de session en lecture seule. Vous pouvez essayer d'ajouter cela à votre contrôleur et voir comment il vole. Je suppose que ce ne sera pas parce que les contrôleurs mvc ASP.NET se produisent bien après que le IHttpHandler est câblé, mais ça vaut le coup.

Une autre solution pourrait être d'enrouler les variables d'état de session dans votre propre classe, et d'exposer une version en lecture seule pour appliquer readonly. L'accès à travers plusieurs demandes ne devrait pas poser de problème, mais vous avez raison de dire que vous pouvez obtenir des conditions de concurrence et ainsi de suite si vous essayez d'écrire sur les mêmes variables de session sous plusieurs angles.

+0

L'objectif n'est pas de rendre les variables en lecture seule, le but est d'autoriser plusieurs requêtes simultanées vers des pages MVC à partir d'un seul client. Envelopper les variables de session dans un wrapper en lecture seule n'aidera pas cela. – Mark

+0

Je suppose que je ne vous suis pas tout à fait alors - pourquoi ReadOnly importe-t-il sinon d'éviter les conditions de course quand il pourrait y avoir des mises à jour simultanées? Si toutes vos pages ne font que lire des données de session, avoir des requêtes simultanées ne fera pas de mal. Si toutes vos pages ont besoin de mettre à jour la session simultanément, le fait d'emballer des choses comme ReadOnly ne va pas aider. –

+1

La lecture seule est importante car l'environnement d'exécution ASP.NET n'autorise pas plusieurs demandes provenant du même client sauf si une session en lecture seule est spécifiée. Je ne peux pas avoir des demandes simultanées à moins que je spécifie une session en lecture seule, et la question demande comment faire cela dans ASP.NET MVC. – Mark

-2

Qu'en est-il de définir les données que vous voulez être "Lecture seule" comme étant statiques dans votre modèle? De cette façon, vous pourriez avoir des demandes simultanées à MVC avec les mêmes données.

+2

Problèmes de threads ne sont pas ce que j'essaie de résoudre ici, le problème est que ASP.NET ne permettra pas une application Web gérer plusieurs demandes du même client en même temps à moins qu'il ne pense que l'état de session est éteint ou que le gestionnaire traitant les demandes ne modifie pas l'état de la session. La création de champs dans le modèle statique n'indiquera pas à ASP.NET que l'état de la session est en lecture seule. – Mark