1

在我的 asp.net 应用程序中,我有一些会话变量。在本地主机和网络主机上似乎只有几分钟,它们失去了价值。这种情况会周期性地发生,并非总是如此。我确实有便宜的爸爸,网络托管,这可能是网络服务器上的问题。感谢您的帮助,这是一个大问题。

   <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="3600" defaultUrl="~/" name="" />
    </authentication>
    <sessionState mode="InProc" cookieless="false" timeout="80" />

 public static User User
    {
        get
        {
            User userLogin = null;
            object sessionVar = Session[USERLOGIN];
            if (sessionVar != null)
            {
                userLogin = (User) sessionVar;
            }
            return userLogin;
        }
        set { Session[USERLOGIN] = value; }
    }
4

2 回答 2

4

很有可能您的会话在服务器上因应用程序池被停止和启动、超时或许多其他事情而被清除。要点是会话变量本身是不可靠的持久性机制。

如果您需要为登录用户保留信息,请尝试在用户的计算机上存储一个 cookie,如果会话为空,则从 cookie 中的标识数据重新填充它。

于 2012-08-22T02:00:48.760 回答
1

如果我可以发表评论,我会的,显然我不够特别;P 大声笑。在这两点上,我都必须同意 KodeKreachor 和 Aristos 的观点。我不确定为什么有业务/合理需要将会话状态保存在内存中。

补充一点,主要是因为我讨厌 cookie,您可以推出一个解决方案以将会话状态记录在轻量级数据库中。我的意思是它真的是一个 cookie,用于平面文件数据库信息记录。SQLite 可能是一个很好的解决方案,但除非我能找到其他方法,否则您将在此基础上推出自己的解决方案。是的,作为一个热爱 Godaddy 的支持者,他们更便宜的服务有很多不足之处。几乎无法控制系统对共享主机的操作。我与他们的技术部门谈论什么是允许的,什么是不允许的,我的经验可以告诉你。

我还要提到,您可能希望使用诸如 Log4Net 之类的解决方案将一些非常详细的日志记录添加到系统中,然后解析日志以获取有关擦除会话状态时实际发生的情况的信息。然后带着这些信息继续寻找更清晰的解决方案。

或者只是放松自己并使用cookies;)

只需修改 SQLite =D
HOW TO: Configure SQL Server to Store ASP.NET Session State

当然这里是一个 SQLite Session State Provider
SQLiteSessionStateStore

Apache Log4Net

BeefyCode 的关于使用 Log4Net 的精彩教程系列

于 2012-08-22T02:31:36.790 回答