HttpContext.Current.Session est null lors du routage des requêtes

Sans routage, HttpContext.Current.Session est présent, donc je sais que le StateServer fonctionne. Lorsque HttpContext.Current.Session mes requêtes, HttpContext.Current.Session est null dans la page routée. J’utilise .NET 3.5 sp1 sur IIS 7.0, sans les aperçus MVC. Il semble que AcquireRequestState ne soit jamais déclenché lors de l’utilisation des routes et que la variable de session n’est pas instanciée / remplie.

Lorsque j’essaie d’accéder aux variables de session, j’obtiens cette erreur:

base {System.Runtime.InteropServices.ExternalException} = {"Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the .

Pendant le débogage, j’obtiens également l’erreur que le HttpContext.Current.Session n’est pas accessible dans ce contexte.

Mon web.config ressemble à ceci:

  ...    ...   ...   ...  

Voici l’implémentation d’IRouteHandler:

 public class WebPageRouteHandler : IRouteHandler, IRequiresSessionState { public ssortingng m_VirtualPath { get; private set; } public bool m_CheckPhysicalUrlAccess { get; set; } public WebPageRouteHandler(ssortingng virtualPath) : this(virtualPath, false) { } public WebPageRouteHandler(ssortingng virtualPath, bool checkPhysicalUrlAccess) { m_VirtualPath = virtualPath; m_CheckPhysicalUrlAccess = checkPhysicalUrlAccess; } public IHttpHandler GetHttpHandler(RequestContext requestContext) { if (m_CheckPhysicalUrlAccess && !UrlAuthorizationModule.CheckUrlAccessForPrincipal( m_VirtualPath, requestContext.HttpContext.User, requestContext.HttpContext.Request.HttpMethod)) { throw new SecurityException(); } ssortingng var = Ssortingng.Empty; foreach (var value in requestContext.RouteData.Values) { requestContext.HttpContext.Items[value.Key] = value.Value; } Page page = BuildManager.CreateInstanceFromVirtualPath( m_VirtualPath, typeof(Page)) as Page;// IHttpHandler; if (page != null) { return page; } return page; } } 

J’ai aussi essayé de mettre EnableSessionState="True" en haut des pages aspx, mais toujours rien.

Des idées? Dois-je écrire un autre HttpRequestHandler qui implémente IRequiresSessionState ?

Merci.

    Je l’ai. Assez stupide, en fait. Cela a fonctionné après que j’ai enlevé et ajouté le SessionStateModule comme ceci:

      ...  ...    ...    

    Il ne suffit pas de l’append car “Session” aurait déjà dû être défini dans la machine.config .

    Maintenant, je me demande si c’est la chose habituelle à faire. Cela ne semble sûrement pas le cas, car cela semble si grossier …

    Ajoutez simplement l’atsortingbut runAllManagedModulesForAllRequests="true" à system.webServer\modules dans web.config.

    Cet atsortingbut est activé par défaut dans les projets MVC et Dynamic Data.

    runAllManagedModulesForAllRequests=true est en réalité une vraie mauvaise solution. Cela a augmenté le temps de chargement de mon application de 200%. La meilleure solution consiste à supprimer et à append manuellement l’object de session et à éviter que tous les atsortingbuts de tous les modules gérés soient exécutés.

    Bon travail! J’ai eu exactement le même problème. L’ajout et la suppression du module Session ont parfaitement fonctionné pour moi. Il n’a cependant pas été récupéré par HttpContext.Current.User donc j’ai essayé votre petite astuce avec le module FormsAuth et bien sûr, ça l’a fait.

       

    Ce que dit @Bagdan Maxim. Ou changez pour utiliser InProc si vous n’utilisez pas un serveur d’état de sesssion externe.

      

    Regardez ici pour plus d’informations sur la directive SessionState.

    Aucune des solutions ci-dessus n’a fonctionné pour moi. J’ai ajouté la méthode suivante dans global.asax.cs puis la session n’était pas nulle:

     protected void Application_PostAuthorizeRequest() { HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required); } 

    J’ai eu un problème similaire et je l’ai “résolu”: Routage ASP.NET – Les itinéraires personnalisés sont-ils complètement sautés dans le Global.asax?

    une meilleure solution est

    runAllManagedModulesForAllRequest est une chose intelligente à faire pour respecter le module de session de suppression et de réinsertion.

    alk.

    Il semble que vous ayez oublié d’append votre adresse de serveur d’état dans le fichier de configuration .

       

    La section de configuration semble saine comme si cela fonctionnait si les pages étaient accédées normalement. J’ai essayé les autres configurations proposées mais le problème est toujours là.

    Je doute que le problème soit dans le fournisseur de session car cela fonctionne sans le routage.

    Je pense que cette partie du code apporte des modifications au contexte.

      Page page = BuildManager.CreateInstanceFromVirtualPath( m_VirtualPath, typeof(Page)) as Page;// IHttpHandler; 

    Aussi cette partie du code est inutile:

      if (page != null) { return page; } return page; 

    Il retournera toujours la page si elle est nulle ou non.

    Il me manquait une référence à System.web.mvc dll dans l’adaptateur de session, et l’ajout du même problème a résolu le problème.

    Espérons que cela aidera quelqu’un d’autre à traverser le même scénario.