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.
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...
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.
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.
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"/>
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.
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);
}
J'ai eu un problème similaire, et "résolu": ASP.NET routage-faire des Routes personnalisées complètement sauter tout dans le Global.asax?
Une meilleure solution est
RunAllManagedModulesForAllRequest est une chose intelligente à faire respecter la suppression et la resinsertion du module de session.
Alk.
La Solution est expliquée ici, http://jgvimalan.wordpress.com/2011/05/31/httpcontext-current-return-null-in-iis-7/
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" />
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.
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.
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.