ASP.NET MVC 5 - 会话永不过期

时间:2013-11-11 09:47:21

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

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

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集合,它将满足我的需求

3 个答案:

答案 0 :(得分:1)

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

尝试将以下内容添加到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; 
}

答案 1 :(得分:1)

尝试离开应用无效几分钟(在debug mode中运行)并添加一个断点:

protected void Session_Start() {}

Global.asax文件中,看看当你返回应用程序时是否会出现这种情况。这应该确认会话实际上已被终止。

您还可以记录Session ID,并使用Tracing进行记录,以查看ID更改的时间。

答案 2 :(得分:1)

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

相关问题