Désactiver l’état de session par demande dans ASP.Net MVC

Je crée un ActionResult dans ASP.Net MVC pour servir des images. Avec l’état de session activé, IIS ne traitera qu’une demande à la fois du même utilisateur. (Ceci est vrai pas seulement dans MVC.)

Par conséquent, sur une page contenant plusieurs images rappelant cette action, une seule demande d’image peut être traitée à la fois. C’est synchrone.

Je voudrais que cette action Action soit asynchrone – je voudrais que plusieurs requêtes d’image soient exécutées sans avoir besoin que la précédente se termine. (Si les images n’étaient que des fichiers statiques, IIS les servirait de cette façon.)

Donc, je voudrais désactiver Session uniquement pour les appels à cette action, ou pour spécifier que certaines demandes n’ont pas d’état de session. Quelqu’un sait comment cela se fait dans MVC? Merci!

Plutôt que d’implémenter un filtre d’action pour cela, pourquoi RouteHandler vous pas un RouteHandler ?

Voici l’accord – IRouteHandler a une méthode – GetHttpHandler . Lorsque vous envoyez une requête ASP.Net MVC à un contrôleur, le moteur de routage gère par défaut la requête en créant une nouvelle instance de MvcRouteHandler , qui retourne un MvcHandler . MvcHandler est une implémentation de IHttpHandler qui est marquée par l’interface (surprise!) IRequiresSessionState . C’est pourquoi une requête normale utilise Session.

Si vous suivez mon article sur la façon d’implémenter un RouteHandler personnalisé (au lieu d’utiliser MvcRouteHandler) pour servir des images, vous pouvez ignorer le renvoi d’un IHttpHandler marqué par une session.

Cela devrait empêcher IIS d’imposer la synchronicité sur vous. Il serait également probablement plus performant car il ignore toutes les couches du code MVC traitant des filtres.

Si quelqu’un se trouve dans la situation où j’étais, où votre contrôleur d’image a réellement besoin d’un access en lecture seule à la session, vous pouvez placer l’atsortingbut SessionState sur votre contrôleur

 [SessionState(SessionStateBehavior.ReadOnly)] 

Voir http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateatsortingbute.aspx pour plus d’informations.

Merci à https://stackoverflow.com/a/4235006/372926

Essayez de servir les images d’un autre domaine. Donc quelque chose comme images.mysite.com.

Cela vous procurera deux avantages: premièrement, les sessions sont suivies par un cookie, donc images.mysite.com n’aura pas le cookie. Deux, il vous donnera deux demandes supplémentaires simultanées pour récupérer des images.

Avez-vous envisagé de créer un HttpHandler pour servir vos images?

L’atsortingbut SessionState est très utile si vous utilisez mvc3. Comment y parvenir avec mvc2 nécessite un peu plus de codage.

L’idée est de dire à asp.net que cette requête spécifique n’utilisera pas d’object de session.

Donc, créez un gestionnaire de route personnalisé pour des requêtes spécifiques

 public class CustomRouteHandler : IRouteHandler { public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext) { requestContext.HttpContext.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly); return new MvcHandler(requestContext); } } 

SessionStateBehavior enum a 4 membres, vous devez utiliser les modes “disabled” ou “readonly” pour obtenir un comportement asynchrone.

Après avoir créé ce gestionnaire de routage personnalisé, assurez-vous que vos requêtes spécifiques passent par ce gestionnaire. Cela peut être fait en définissant de nouvelles routes sur Global.asax

 routes.Add("Default", new Route( "{controller}/{action}", new RouteValueDictionary(new { controller = "Home", action = "Index"}), new CustomRouteHandler() )); 

L’ajout de cette route permet de traiter toutes vos demandes par votre classe de gestionnaire de route personnalisée. Vous pouvez le rendre spécifique en définissant différents itinéraires.

Modifiez DefaultCOntrollerFactory en classe ControllerFactory personnalisée. Controller.TempDataProvider par défaut utilise SessionStateTempDataProvider. vous pouvez le changer.

1.Définissez web.config / system.web / sessionState: mode = “Off”.

2.créer la classe DictionaryTempDataProvider.

  public class DictionaryTempDataProvider : ITempDataProvider { public IDictionary LoadTempData(ControllerContext controllerContext) { return new Dictionary(); } public void SaveTempData(ControllerContext controllerContext, IDictionary values) { } } 

3.Créer DictionaryTempDataControllerFactory

  public class DictionaryTempDataControllerFactory : DefaultControllerFactory { public override IController CreateController(System.Web.Routing.RequestContext requestContext, ssortingng controllerName) { var controller = base.CreateController(requestContext, controllerName) as Controller; if (controller!=null) controller.TempDataProvider = new DictionaryTempDataProvider(); return controller; } } 

4.Dans l’événement global.asax.cs Appissage_Start, définissez DictionaryTempDataControllerFactory.

 protected void Application_Start() { RegisterRoutes(RouteTable.Routes); ControllerBuilder.Current.SetControllerFactory( new DictionaryTempDataControllerFactory() ); } 

J’ai également 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 un atsortingbut personnalisé
  2. Remplacez la méthode «GetControllerSessionBehavior» présente dans la classe DefaultControllerFactory.
  3. Enregistrez-le dans global.aspx

1> Créer un atsortingbut personnalisé

 public sealed class ActionSessionStateAtsortingbute : Atsortingbute { public SessionStateBehavior SessionBehavior { get; private set; } public ActionSessionStateAtsortingbute(SessionStateBehavior sessionBehavior) { SessionBehavior = sessioBehavior; } } 

2. Remplacer

 public class SessionControllerFactory : DefaultControllerFactory { protected override SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType) { if (controllerType == null) return SessionStateBehavior.Default; var actionName = requestContext.RouteData.Values["action"].ToSsortingng(); Type typeOfRequest=requestContext.HttpContext.Request.RequestType.ToLower() =="get"?typeof(HttpGetAtsortingbute):typeof(HttpPostAtsortingbute); // [Line1] var cntMethods = controllerType.GetMethods() .Where(m => m.Name == actionName && ( ( typeOfRequest == typeof(HttpPostAtsortingbute) && m.CustomAtsortingbutes.Where(a => a.AtsortingbuteType == typeOfRequest).Count()>0 ) || ( typeOfRequest == typeof(HttpGetAtsortingbute) && m.CustomAtsortingbutes.Where(a => a.AtsortingbuteType == typeof(HttpPostAtsortingbute)).Count() == 0 ) ) ); MethodInfo actionMethodInfo = actionMethodInfo = cntMethods != null && cntMethods.Count() == 1 ? cntMethods.ElementAt(0):null; if (actionMethodInfo != null) { var sessionStateAttr = actionMethodInfo.GetCustomAtsortingbutes(typeof(ActionSessionStateAtsortingbute), false) .OfType() .FirstOrDefault(); if (sessionStateAttr != null) { return sessionStateAttr.Behavior; } } return base.GetControllerSessionBehavior(requestContext, controllerType); } 

3. Inscrivez la classe dans Global.asax

 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { // --- other code --- ControllerBuilder.Current.SetControllerFactory(typeof(SessionControllerFactory)); } } 

Sur notre serveur, IIS ne connaît même pas les sessions – c’est la stack ASP.NET qui gère une requête par session à la fois. Les fichiers statiques, comme les images, ne sont jamais affectés.

Est-il possible que votre application ASP.NET serve les fichiers au lieu d’IIS?

Créer un nouveau contrôleur

Décorez le contrôleur avec [SessionState (SessionStateBehavior.Disabled)]

Code de refactoring que vous souhaitez voir voir désactivé pour ce contrôleur