HttpContext.Actuel.La Session est null lors du routage des demandes

Sans routage, HttpContext.Current.Session est là donc je sais que le StateServer fonctionne. Lorsque j'achemine 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 n'est jamais déclenché lors de l'utilisation des routes et que la variable de session n'est donc pas instanciée/remplie.

, Lorsque j'essaie d'accéder aux variables de Session, j'ai 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 <configuration>.

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:

<configuration>
  ...
  <system.web>
    <pages enableSessionState="true">
      <controls>
        ...
      </controls>
    </pages>
    ...
  </system.web>
  <sessionState cookieless="AutoDetect" mode="StateServer" timeout="22" />
  ...
</configuration>

Voici L'implémentation IRouteHandler:

public class WebPageRouteHandler : IRouteHandler, IRequiresSessionState
{
    public string m_VirtualPath { get; private set; }
    public bool m_CheckPhysicalUrlAccess { get; set; }

    public WebPageRouteHandler(string virtualPath) : this(virtualPath, false)
    {
    }
    public WebPageRouteHandler(string 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();
        }

        string var = String.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? Devrais-je écrire un autre {[11] } qui implémente IRequiresSessionState?

Merci.

42
demandé sur Loki 2008-10-20 15:03:28

13 réponses

Obtenu. Tout à fait stupide, en fait. Cela a fonctionné après avoir supprimé et ajouté le SessionStateModule comme suit:

<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

L'ajout simple ne fonctionnera pas puisque "Session" aurait déjà été défini dans le machine.config.

Maintenant, je me demande si c'est la chose habituelle à faire. Il ne semble sûrement pas, car il semble si brut...

52
répondu Loki 2009-02-10 09:19:56

Juste ajouter un attribut runAllManagedModulesForAllRequests="true" à system.webServer\modules dans le web.config.

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

23
répondu gandjustas 2011-11-17 10:48:07

runAllManagedModulesForAllRequests=true est en fait une vraie mauvaise solution. Cela a augmenté le temps de chargement de mon application de 200%. La meilleure solution consiste à supprimer et ajouter manuellement l'objet session et à éviter l'attribut run all managed modules tous ensemble.

14
répondu Frankie Rodriguez 2011-06-21 18:16:04

Beau travail! J'ai eu exactement le même problème. Ajouter et supprimer le module de Session a parfaitement fonctionné pour moi aussi. Il n'a cependant pas ramené par HttpContext.Actuel.Utilisateur j'ai donc essayé votre petit truc avec le module FormsAuth et bien sûr, cela l'a fait.

<remove name="FormsAuthentication" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>
3
répondu Mike 2008-12-13 02:44:27

Ce que @ Bogdan Maxim a dit. Ou changez pour utiliser InProc si vous n'utilisez pas un serveur d'état sesssion externe.

<sessionState mode="InProc" timeout="20" cookieless="AutoDetect" />

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

2
répondu tvanfosson 2008-10-20 11:30:28

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

protected void Application_PostAuthorizeRequest()
{
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
2
répondu Viqas 2017-09-22 14:50:02
1
répondu Timothy Khouri 2017-05-23 12:00:31

Une meilleure solution est

RunAllManagedModulesForAllRequest est une chose intelligente à faire respecter la suppression et la resinsertion du module de session.

Alk.

1
répondu Alkampfer 2009-10-28 17:55:50
1
répondu s divya 2011-09-25 21:13:13

Il semble que vous ayez oublié d'ajouter votre adresse de serveur d'état dans le fichierconfig .

 <sessionstate mode="StateServer" timeout="20" server="127.0.0.1" port="42424" />
0
répondu Bogdan Maxim 2008-10-20 11:10:19

La section config semble saine car elle fonctionne si les pages sont accessibles normalement. J'ai essayé les autres configurations suggérées mais le problème est toujours là.

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

0
répondu Loki 2008-10-20 11:43:08

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 flétrir elle est nulle ou non.

0
répondu mohammedn 2008-10-20 13:59:04

Il me manquait une référence au système.Web.MVC dll dans l'adaptateur de session, et l'ajout de la même chose a résolu le problème.

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

0
répondu Mandeep Janjua 2012-10-07 20:27:58