【发布时间】:2011-04-30 18:24:29
【问题描述】:
我在用户填写申请表时丢失会话数据时遇到了一些麻烦。看来他们正在通过申请表部分丢失会话状态。 (ASP.NET 4.0 WebForms 项目,IIS 6.0)
会话存储在状态服务器中的进程外,因此它不是配置更改、应用程序域回收等 AFAIK。
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" timeout="20" />
我正在使用表单身份验证,滑动到期工作正常,您可以从下面的日志中看到 - 您可以看到票证到期时间正确并按预期延长。
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" />
</authentication>
我启用了一些自定义日志记录来尝试追踪这一点。在global.asax 中的每一次Session_Start 触发时,我都会记录一些内容,并且每次有人加载申请表或单击“下一步”以在浏览应用程序表单时在部分之间(在多视图中)移动时,我也会记录一些内容。
以下是人们失去会话状态的两个示例。日志以日志条目的日期/时间开始,然后是一些措辞。括号中的第二个日期/时间(在措辞之后)是 FormsAuthentication cookie 的到期日期/时间,源自 CType(ctx.User.Identity, FormsIdentity).Ticket.Expiration.ToString
日志还会记录用户的 IP 地址和会话 ID。在将它们粘贴到此处之前,我已将它们删除,我可以确认所有日志条目的 IP 地址和会话 ID 相同。
示例 1:
**[26/10/2010 13:07] 会议开始 []** [26/10/2010 13:11] 申请表第一页_Load [26/10/2010 13:31:19] [26/10/2010 13:13] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [26/10/2010 13:31:19] [26/10/2010 13:14] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [26/10/2010 13:31:19] [26/10/2010 13:15] 下一次点击应用程序窗体,当前索引为 3 (vwSection3) [26/10/2010 13:31:19] [26/10/2010 13:20] 下一次点击应用程序窗体,当前索引为 5 (vwSection4) [26/10/2010 13:31:19] [26/10/2010 13:20] 下一次点击应用程序窗体,当前索引为 6 (vwSection5) [26/10/2010 13:31:19] [26/10/2010 13:20] 下一次点击应用程序窗体,当前索引为 7 (vwMonitoring) [26/10/2010 13:31:19] [26/10/2010 13:21] 下一次点击应用程序窗体,当前索引为 8 (vwInformation) [26/10/2010 13:31:19] [26/10/2010 13:22] 申请表第一页_Load [26/10/2010 13:41:22] [26/10/2010 13:25] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [26/10/2010 13:41:22] [26/10/2010 13:26] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [26/10/2010 13:41:22] [26/10/2010 13:26] 下一次点击应用程序窗体,当前索引为 3 (vwSection3) [26/10/2010 13:41:22] [26/10/2010 13:28] 下一次点击应用程序窗体,当前索引为 5 (vwSection4) [26/10/2010 13:41:22] [26/10/2010 13:28] 下一次点击应用程序窗体,当前索引为 6 (vwSection5) [26/10/2010 13:41:22] [26/10/2010 13:28] 下一次点击应用程序窗体,当前索引为 7 (vwMonitoring) [26/10/2010 13:41:22] [26/10/2010 13:28] 下一次点击应用程序窗体,当前索引为 8 (vwInformation) [26/10/2010 13:41:22] **[26/10/2010 13:28] 会议开始 [26/10/2010 13:41:22]** [26/10/2010 13:31] 申请表第一页_Load [26/10/2010 13:51:24] [26/10/2010 13:31] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [26/10/2010 13:51:24] [26/10/2010 13:32] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [26/10/2010 13:51:24] [26/10/2010 13:32] 下一次点击应用程序窗体,当前索引为 3 (vwSection3) [26/10/2010 13:51:24] [26/10/2010 13:32] 下一次点击应用程序窗体,当前索引为 5 (vwSection4) [26/10/2010 13:51:24] [26/10/2010 13:32] 下一次点击应用程序窗体,当前索引为 6 (vwSection5) [26/10/2010 13:51:24] [26/10/2010 13:32] 下一次点击应用程序窗体,当前索引为 7 (vwMonitoring) [26/10/2010 13:51:24] [26/10/2010 13:32] 下一次点击应用程序窗体,当前索引为 8 (vwInformation) [26/10/2010 13:51:24]示例 2:
**[24/10/2010 17:44] 会议开始 []** [24/10/2010 17:50] 申请表第一页加载 [24/10/2010 18:10:13] [24/10/2010 18:00] 应用窗体下一次点击,当前索引为 1 (vwSection1) [24/10/2010 18:20:40] **[24/10/2010 18:07] 会议开始 [24/10/2010 18:20:40]** [24/10/2010 18:08] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [24/10/2010 18:20:40] [24/10/2010 18:10] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [24/10/2010 18:20:40] [24/10/2010 18:10] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [24/10/2010 18:30:42] [24/10/2010 18:10] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [24/10/2010 18:30:52] [24/10/2010 18:10] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [24/10/2010 18:30:58] [24/10/2010 18:12] 申请表第一页_Load [24/10/2010 18:31:35] [24/10/2010 18:12] 下一次点击应用程序窗体,当前索引为 1 (vwSection1) [24/10/2010 18:31:35] [24/10/2010 18:13] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [24/10/2010 18:31:35] [24/10/2010 18:13] 下一次点击应用程序窗体,当前索引为 2 (vwSection2) [24/10/2010 18:31:35] [24/10/2010 18:16] 下一次点击应用程序窗体,当前索引为 3 (vwSection3) [24/10/2010 18:31:35] [24/10/2010 18:16] 下一次点击应用程序窗体,当前索引为 5 (vwSection4) [24/10/2010 18:31:35] [24/10/2010 18:17] 下一次点击应用窗体,当前索引为 6 (vwSection5) [24/10/2010 18:31:35] [24/10/2010 18:18] 下一次点击应用程序窗体,当前索引为 7 (vwMonitoring) [24/10/2010 18:31:35] [24/10/2010 18:18] 下一次点击应用程序窗体,当前索引为 8 (vwInformation) [24/10/2010 18:31:35]您可以在第一个示例中看到会话最初开始于 13:07,但也开始于 13:28。
您可以在第二个示例中看到会话最初在 17:44 开始,并在 18:07 重新启动。
我知道这些时间是会话开始后 20 分钟。但是会话不是空闲的。您可以看到它没有空闲,因为日志的其余部分。在应用程序表单中单击“下一步”会使某个对象脱离会话状态
Dim m As Member = StateManager.CurrentMember
然后获取/设置“m”的属性。
因此,在我看来,即使用户没有空闲并访问他们的会话变量,他们在开始后正好 20 分钟仍会丢失会话。请注意,在我的基本页面(所有页面都继承自,基本页面继承 System.Web.UI.Page)中,我现在已经开始将当前毫秒写入会话状态,因此我不断写入会话。
用户正在失去他们的会话状态,因为 StateManager.CurrentMember(只是 HttpContext.Current.Session("CurrentMember"))返回 null。当我尝试将其附加到实体框架数据上下文时,这会给出一个未处理的异常 - 因此用户会看到我的通用错误处理页面。
任何想法表示赞赏。
【问题讨论】:
-
嗨 bgs264,您能否连同现有日志一起写下 Session_Start 事件期间的 Session.IsNewSession 值是什么?我对它在会话重启期间的价值感兴趣。我怀疑会话在某个地方突然结束了。
-
会话是否有可能只在“申请表第一个 Page_Load”而不是按钮点击时更新?
-
调试时是否会在本地主机上发生这种情况?这不是需要粘性会话的负载平衡环境吗?您是否将大型对象置于会话状态并达到内存限制?应用池回收是否触发应用重启?
标签: asp.net iis-6 session-state asp.net-4.0 session-timeout