【问题标题】:ASP.NET MVC 5 - Session never expiresASP.NET MVC 5 - 会话永不过期
【发布时间】:2013-11-23 01:42:12
【问题描述】:

我有一个基于 MVC 5 的 Web 项目,并且我使用 HttpSessionStateWrapper 类来处理会话状态。 基本上我在会话状态中存储了一些用户特定的数据。 这是我的代码(没有上下文):

public class Util
{
        private HttpSessionStateWrapper _session;

        public Util()
        {
            _session = new HttpSessionStateWrapper(HttpContext.Current.Session);
        }

        public T Get<T>(string key) where T : class
        {
            var sessionedObject = (T)_session[key];
            if (sessionedObject != null)
            {
                Logger.Instance.LogDebug("Object returned from session. Session Timeout=" + _session.Timeout.ToString() + " Session Id=" + _session.SessionID);
                return sessionedObject;
            }
            return null;
        }
}

Util 类的实例被创建一次,并用作另一种单例类型的静态属性。 我在这里有一些日志记录。因此,通过 Web.config 将会话状态的超时设置为 1 分钟。 但是,即使在 10 分钟内,我的会话似乎也不会消失。

此外,我注意到每个请求SessionId 都是新的,但是当从会话中获取数据时,ID 等于首次生成的会话ID。 Session End 事件也从未为我触发,但Session Start 确实如此。 这是一些日志:

2013-11-11 04:27:38.2578 App Starting 

2013-11-11 04:27:38.6641 Session onStart. Id=0x545pyzbt4e1vzh1h1rr5d5 
2013-11-11 04:27:38.6641 Object returned from session. Session Timeout=1 Session Id=0x545pyzbt4e1vzh1h1rr5d5 

2013-11-11 04:28:06.5263 Session onStart. Id=ujuxasiz5hvzbv15gbvuuxt3  
2013-11-11 04:28:06.5263 Object returned from session. Session Timeout=1 Session Id=0x545pyzbt4e1vzh1h1rr5d5 

2013-11-11 04:29:00.3432 Session onStart. Id=jgwmmh1ubokxn3kfadevfnph 
2013-11-11 04:29:00.3432 Object returned from session. Session Timeout=1 Session Id=0x545pyzbt4e1vzh1h1rr5d5 

2013-11-11 04:39:25.7919 Session onStart. Id=0mocujzp4tbwwvgnkx1mn0qi 
2013-11-11 04:39:25.7919 Object returned from session. Session Timeout=1 Session Id=0x545pyzbt4e1vzh1h1rr5d5 

编辑: 谢谢大家的回复!由于没有时间深入调试这些东西,我决定完全拒绝使用会话状态,并使用HttpContext.Current.Items 集合,它将满足我的需求

【问题讨论】:

    标签: asp.net-mvc session-state session-timeout asp.net-mvc-5


    【解决方案1】:

    如果您的应用程序中存在一些严重问题或者您有大量内存泄漏,您的 IIS 应用程序轮询将重新启动应用程序并且您将遇到这种行为。查看您的系统事件日志。 IIs 日志。

    【讨论】:

      【解决方案2】:

      尝试让应用程序处于非活动状态几分钟(在debug mode 中运行)并在以下位置添加断点:

      protected void Session_Start() {}
      

      Global.asax 文件中,并查看当您返回应用程序时是否遇到此问题。这应该确认会话实际上正在终止。

      您还可以记录Session ID,并使用Tracing 记录此内容以查看ID 何时更改。

      【讨论】:

        【解决方案3】:

        我认为您在每个请求上都会获得一个新会话,因为您没有在会话中存储任何内容。

        尝试将以下内容添加到 Global.asax.cs:

        protected void Session_Start() 
        { 
            // Since .NET 2.0 ASP.NET will create a new session for each request 
            // unless some data is stored in the session, so here we go... 
            Session["dummy"] = 0; 
        }
        

        【讨论】:

        • 谢谢。已经尝试过了,结果还是一样——每个请求都有新的会话 ID。这不是主要问题,我想知道为什么“第一个”会话永不过期。由于 Util 类是单例的一部分,它在每个应用程序生命周期中只启动一次,这就是为什么它始终处于“第一个”会话状态,但为什么该会话永远不会过期
        猜你喜欢
        • 2015-01-14
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多