【问题标题】:Session state not available in Global.asax's AcquireRequestState nor PostAcquireRequestState events会话状态在 Global.asax 的 AcquireRequestState 和 PostAcquireRequestState 事件中不可用
【发布时间】:2015-09-30 04:44:08
【问题描述】:

我有一个 ASP.NET MVC 应用程序,它具有每个用户的设置,包括当前的文化设置。我们应该在HttpApplicationApplication_AcquireRequestStateApplication_PostAcquireRequestState 事件中设置Thread.CurrentThread.CurrentCulture

我想在会话状态字典中维护用户的设置,但是在我观察到的 Application_AcquireRequestState 方法中:

  1. HttpContext.Current.Session == null
  2. QuickWatch 窗口报告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" />

为什么 Session 不可用?

【问题讨论】:

  • 这不是答案,而是观察结果:我注意到这种情况发生在两种情况下:在 Visual Studio 2008 和 IIS 7.5 中使用“Cassini”网络服务器时的所有请求,但仅当对非 ASP.NET 资源(如静态文件)发出请求时,runManagedModulesForAllRequests="true".

标签: asp.net-mvc session-state


【解决方案1】:

我刚刚遇到了这个问题,经过一些研究后设法解决了这个问题。希望这能有所帮助。

我不确定你在 web.config 中有<sessionState mode="InProc" /> 的部分。

就我而言,我需要检查我的Session["Language"] 是否为空 Application_AcquireRequestState。如果不是,那么做一些关于它的代码。当我运行我的程序时,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 块中遇到任何会话状态错误,我的最终语言值始终是“EN”。我知道这是处理代码的一种非常讨厌的方式,但就我而言,我可以避免会话状态错误并确保 lang 变量始终可以返回一个值。

希望这能有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2014-02-01
    • 1970-01-01
    • 2013-10-19
    • 2012-06-07
    • 2013-09-20
    • 1970-01-01
    • 2011-10-19
    相关资源
    最近更新 更多