我有一个 ASP.net 应用程序,其中用户无法成功完成某些操作,我假设的原因只能与丢失 session 有关(这是我维护其当前用户信息的地方,并且如何判断是否登录)
我不知道他们为什么会失去 session ,所以我的第一个问题是:
什么(通常)会导致用户在 ASP.net 中丢失 session ?
因为我不知道用户何时丢失 session 并且无法自己重现它:
如何跟踪用户何时丢失 session
下面是我的 sessionState 配置供引用
<sessionState
mode="InProc"
cookieless="false"
cookieName="My.Site.Com"
timeout="480"/>
最佳答案
许多事情都可能导致 session 状态神秘消失。
- 您的 sessionState 超时已过期
- 您更新了 web.config 或其他导致 AppDomain 回收的文件类型
- IIS 中的应用程序池会回收
- 您使用大量文件更新网站,ASP.NET 会主动销毁您的 AppDomain 以重新编译并保留内存。
-
如果您使用的是 IIS 7 或 7.5,请注意以下几点:
- 默认情况下,IIS 将应用程序池设置为在一段时间不活动后自行关闭。
- 默认情况下,IIS 将 AppPools 设置为每 1740 分钟回收一次(显然取决于您的根配置,但这是默认设置)
- 在 IIS 中,查看应用程序池的“高级设置”。其中有一个称为“空闲超时”的属性。将其设置为零或高于默认值 (20) 的数字。
- 在 IIS 中,检查应用程序池的“回收”设置。您可以在此处启用或禁用 AppPool 回收。向导的第二页是一种将每种类型的 AppPool 关闭记录到事件日志的方法。
如果您使用的是 IIS 6,则适用相同的设置(在大多数情况下,但访问它们的方式不同),但是让它们记录回收则更加痛苦。以下是让 IIS 6 记录 AppPool 回收事件的方法的链接:
-
如果您正在更新网络应用程序上的文件,您应该预料到所有 session 都会丢失。这就是野兽的本性。但是,您可能没想到它会发生多次。如果您更新 15 个或更多文件(aspx、dll 等),则您可能会在一段时间内多次重新启动,因为访问该站点的用户会重新编译这些页面。请参阅这两个链接:
http://support.microsoft.com/kb/319947
将 numCompilesBeforeAppRestart 设置为更高的数字(或手动弹回您的 AppPool)将消除此问题。
-
您始终可以处理 Application_SessionStart 和 Application_SessionEnd 以便在 session 创建或结束时收到通知。 HttpSessionState 类还有一个 IsNewSession属性,您可以检查任何页面请求以确定是否为事件用户创建了新 session 。
-
最后,如果您的情况可能的话,我使用了 SQL Server session mode取得了良好的成功。如果您在其中存储大量数据(每个请求都从 SQL Server 加载并保存全部数据),则不建议这样做,并且如果您在其中放入自定义对象(因为它们必须是可序列化的),这可能会很痛苦),但它在共享托管场景中帮助了我,在该场景中我无法将我的 AppPool 配置为不回收几个小时。就我而言,我存储了有限的信息,并且没有对性能产生不利影响。除此之外,默认情况下现有用户将重用其 SessionID,而我的用户从未注意到他们的内存中 session 已被 AppPool 回收删除,因为它们的所有状态都存储在 SQL Server 中。
关于asp.net - 丢失 session 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3515947/