我有一个ASP.NET MVC应用程序,它具有每个用户的设置,包括当前的区域性设置。我们应该在Thread.CurrentThread.CurrentCulture
的Application_AcquireRequestState
或Application_PostAcquireRequestState
事件中设置HttpApplication
。
我希望在会话状态字典中维护用户的设置,但是在我的Application_AcquireRequestState
方法中我观察到:
HttpContext.Current.Session == null
this.Session
:((System.Web.HttpApplication)(this)).Session'
抛出了一个类型为'System.Web.HttpException' System.Web.SessionState.HttpSessionState {System.Web.HttpException}
的异常“会话状态在此上下文中不可用”。有趣的是,HttpContext.Current._sessionStateModule == null
是真的,尽管我的web.config文件中有<sessionState mode="InProc" />
。
为什么会话不可用?
发布于 2015-09-25 15:57:04
我只是遇到了这个问题,并设法解决了一些研究。希望这能帮上忙。
我不太清楚你在<sessionState mode="InProc" />
in web.config you的那一部分。
在我的例子中,我需要检查我的Session["Language"]
在Application_AcquireRequestState
中是否为null。如果不是,那就做些代码吧。当我运行我的程序时,Application_AcquireRequestState是代码首先要用到的地方。此时,会话绝对是空的。因此,如果您正在编写任何会话,并且断点跨过它,它肯定会碰到错误。
根据周期,在运行程序时,Application_AcquireRequestState中的会话状态还没有准备好。
稍后,在执行了第一个页面并设置了会话值之后,将再次调用Application_AcquireRequestState
,这一次我已经设置了会话。这样错误就不会再次出现了。
为了解决这个问题,我有以下完整的代码:
try
{
if (System.Web.HttpContext.Current.Session != null)
{
if (System.Web.HttpContext.Current.Session["Language"] != null)
{
lang = System.Web.HttpContext.Current.Session["Language"].ToString();
}
else
{
lang = "EN";
}
}
else
{
lang = "EN";
}
}
catch
{
lang = "EN";
}
对于上面的代码,我的默认语言是EN,不管会话状态是否就绪。即使代码在try块中碰到任何会话状态错误,我最后的lang值总是"EN“。我知道这是处理代码的一种非常糟糕的方法,但对于我的情况,我可以避免会话状态错误,并确保lang变量始终可以返回一个值。
希望这能帮上忙。
https://stackoverflow.com/questions/29875424
复制相似问题