ASP.NET会话问题

时间:2010-02-12 01:36:50

标签: asp.net session

我有一个自定义ASP.NET会话管理器类,如下所示:

public sealed class SessionManager : Page
    {
        private const string USER = "User";

        private static readonly SessionManager _instance = new SessionManager();

        private SessionManager()
        {
        }


        public static SessionManager Instance
        {
            get { return _instance; }
        }


        public User User
        {
            get { return Session[USER] as User; }
            set { Session[USER] = value; }
        }

    }

用户成功登录系统后,主页上会显示其全名。以下是我面临的问题:

1)我首先登录系统,因为John和John的全名显示在主页上,相应的用户对象保持在会话中。

2)现在从另一台PC上我以Mark身份登录系统。现在,Mark的全名显示在主页上,相应的用户对象保持在会话中。

3)现在,当我访问John已登录的PC并刷新主页时,我看到了Marks的名字,而不是Johns的名字。

这种奇怪行为可能是什么原因?

1 个答案:

答案 0 :(得分:2)

您的类继承自System.Web.UI.Page,它在首次访问时将其Session成员设置为HttpContext.Current.Session。由于您有一个单例,它将始终引用访问User属性的第一个会话。

您可能应该这样做:

public sealed class SessionManager
{
    private const string USER = "User";

    private static readonly SessionManager _instance = new SessionManager();

    private SessionManager()
    {
    }

    public static SessionManager Instance
    {
        get { return _instance; }
    }

    public User User
    {
        get { return HttpContext.Current.Session[USER] as User; }
        set { HttpContext.Current.Session[USER] = value; }
    }
}