Désactiver l'état de Session par demande en ASP.Net MVC
Je suis entrain de créer un ActionResult dans ASP.Net MVC pour servir des images. Avec l'état de Session est activée, IIS ne gérer qu'une seule requête à la fois à partir du même utilisateur. (Cela est vrai non seulement dans MVC.)
Par conséquent, sur une page avec plusieurs images de l'appeler à cette Action, une seule demande d'image peut être manipulée à la fois. Il est synchrone.
J'aimerais que cette image de l'Action asynchrone -- je voudrais des images de multiples demandes à chaque exécution sans avoir à remplir. (Si les images sont juste des fichiers statiques, IIS servir de cette façon.)
Donc, je voudrais désactiver la Session juste pour les appels à l'Action, ou de spécifier que certaines demandes n'ont pas d'état de Session. Quelqu'un sait comment cela se fait dans MVC? Merci!
Vous devez vous connecter pour publier un commentaire.
Plutôt que de mettre en place une action de filtre pour cela, pourquoi ne pas mettre en œuvre un
RouteHandler
?Voici l'affaire -
IRouteHandler
a une méthode -GetHttpHandler
. Lorsque vous effectuez un ASP.Net MVC demande à un contrôleur, par défaut, le moteur de routage poignées de la demande par la création d'une nouvelle instance deMvcRouteHandler
, qui retourne unMvcHandler
.MvcHandler
est une implémentation deIHttpHandler
qui est marqué par l' (surprise!)IRequiresSessionState
interface. C'est pourquoi une requête normale utilise Session.Si vous suivez mon blog sur la façon de mettre en œuvre une coutume
RouteHandler
(au lieu d'utiliser MvcRouteHandler) pour servir des images - vous pouvez passer de retour d'une session-taggedIHttpHandler
.Ceci devrait IIS d'imposer la synchronicité sur vous. Il est également susceptible d'être plus performant parce que c'est en sautant toutes les couches de la MVC du code de traiter avec les filtres.
SessionState
attribut peut être que vous fournissez unlock
au-dessus de votre section critique (c'est à dire la lecture/écriture de la séance). Qui permet de demandes simultanées au serveur, cependant, d'apporter des modifications à lasession
atomique.Si quelqu'un est dans la situation dans laquelle j'étais, où votre image contrôleur a besoin réellement d'un accès en lecture seule à la session, vous pouvez mettre le SessionState attribut sur votre contrôleur de
Voir http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute.aspx pour plus d'info.
Grâce à https://stackoverflow.com/a/4235006/372926
J'ai aussi rencontré le même problème et après avoir fait de la R&D ce lien a fonctionné pour moi
Référence:
https://techatfingers.wordpress.com/2016/06/14/session-state-on-action/
1> Créer des attributs personnalisés
2. Remplacer
3. Registre de classe Mondiale.asax
Essayez de servir les images à partir d'un autre domaine. Donc, quelque chose comme images.mysite.com.
Ce qui vous donnera deux avantages: l'Un, les sessions sont suivies par un cookie, ce qui images.mysite.com n'aurez pas le cookie. De deux, il vous donnera un supplément de deux demandes simultanées pour récupérer les images.
Avez-vous envisagé de mettre en place un HttpHandler pour servir vos images?
SessionState attribut est très utile si u utilisation mvc3. Comment réaliser cela avec mvc2 besoin d'un peu plus de codage.
Idée est de raconter l'asp.net cette demande spécifique l'habitude de l'utilisation de l'objet session.
Donc, Créer un itinéraire personnalisé gestionnaire pour des demandes spécifiques
SessionStateBehavior enum a 4 membres, vous devez utiliser "désactivé" ou "readonly" modes d'obtenir async comportement.
Après la création de cette coutume gestionnaire d'itinéraire, assurez-vous que toutes vos demandes spécifiques, passe par ce gestionnaire. Cela peut être fait par le biais de la définition de nouvelles routes au niveau Mondial.asax
L'ajout de cette route qui rend l'ensemble de vos demandes soient traitées par votre itinéraire personnalisé classe de gestionnaire. Vous pouvez le faire en définissant les différentes routes.
SessionStateBehaviour
àDisabled
et ajouter de la route dansRouteConfig.cs
(méthodeRegisterRoutes(RouteCollection)
) au lieu deGlobal.asax
.Changement DefaultCOntrollerFactory à la coutume ControllerFactory classe. Contrôleur Par Défaut.TempDataProvider utilisation SessionStateTempDataProvider. vous pouvez le modifier.
1.Mettre le web.config/système.web/sessionState:mode="Off".
2.créer DictionaryTempDataProvider classe.
3.Créer DictionaryTempDataControllerFactory
4.Mondiale.asax.cs Apprication_Start événement DictionaryTempDataControllerFactory.
Sur notre serveur, IIS ne sait même pas sur les sessions - c'est la ASP.NET pile qui gère une demande par session à la fois. Les fichiers statiques, tels que des images, ne sont jamais touchés.
Est-il possible que votre ASP.NET application desservant les fichiers au lieu de IIS?
Créer un nouveau Contrôleur de
Décorer controler avec [SessionState(SessionStateBehavior.Désactivé)]
Refactoriser le code que vous voulez seesion a déclaré désactivé pour que contrôleur de