Question

Sans routage, HttpContext.Current.Session est là, donc je sais que le StateServer fonctionne. Lorsque je route mes requêtes, null est AcquireRequestState dans la page routée. J'utilise .NET 3.5 SP1 sur IIS 7.0, sans les aperçus de MVC. Il semble que 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>. ne soit jamais déclenché lors de l'utilisation des itinéraires et que la variable de session ne soit pas instanciée / remplie.

Lorsque j'essaie d'accéder aux variables de session, le message d'erreur suivant s'affiche:

web.config

Lors du débogage, j'obtiens également le message d'erreur indiquant que le EnableSessionState="True" n'est pas accessible dans ce contexte.

-

Mon HttpRequestHandler 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 d'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 également essayé de mettre IRequiresSessionState en haut des pages aspx, mais toujours rien.

Des idées? Dois-je écrire un autre <=> qui implémente <=>?

Merci.

Était-ce utile?

La solution

Compris. Assez stupide, en fait. Cela a fonctionné après avoir enlevé & Amp; ajouté le SessionStateModule comme suit:

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

Il ne suffit pas de l'ajouter, car " Session " aurait déjà dû être défini dans le machine.config.

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

Autres conseils

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

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

runAllManagedModulesForAllRequests=true est en réalité une très mauvaise solution. Cela a augmenté le temps de chargement de mon application de 200%. La meilleure solution consiste à supprimer et à ajouter manuellement l'objet de session et à éviter tous les attributs d'exécuter tous les modules gérés.

Aucune de ces solutions 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);
}

Beau travail! J'ai eu exactement le même problème. Ajouter et supprimer le module Session a parfaitement fonctionné pour moi aussi. Il n’a toutefois pas été rapporté par HttpContext.Current.User, j’ai donc essayé votre petit tour avec le module FormsAuth et, bien sûr, vous y êtes parvenu.

<remove name="FormsAuthentication" />
<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/>

Ce que @Bogdan Maxim a dit. Vous pouvez également utiliser InProc si vous n’utilisez pas de serveur d’état de session externe.

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

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

Il semble que vous ayez oublié d'ajouter votre adresse de serveur d'état dans la config fichier.

 <sessionstate mode="StateServer" timeout="20" server="127.0.0.1" port="42424" />

La section de configuration semble bonne car elle fonctionne lorsque 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 réside dans le fournisseur de session, car il fonctionne sans routage.

Je pense que cette partie du code modifie le contexte.

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

De plus, cette partie du code est inutile:

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

Il retournera toujours la page, qu'elle soit nulle ou non.

une meilleure solution est

runAllManagedModulesForAllRequest est une bonne chose à faire en respectant le module de session de suppression et de réinsertion.

alk.

Il me manquait une référence à la DLL System.web.mvc dans l'adaptateur de session et son ajout corrigeait le problème.

J'espère que cela aidera quelqu'un d'autre à traverser le même scénario.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top