【发布时间】:2014-04-22 04:09:28
【问题描述】:
异常
对于每个页面请求,都会触发 SESSION_START,然后立即触发 SESSION_END。如果会话 cookie 不存在,则会自动创建一个(新 SessionId),并触发两个事件。如果会话 cookie 已经存在,则使用相同/旧的 SessionId。即使会话 cookie 存在,会话变量在每次请求时都会丢失。
说明
我有一个简单的登录页面,它存储登录会话并重定向到登录页面。在登录页面上,我检查会话变量是否存在,如果不存在,则将用户重定向到登录页面。
// login.aspx
if (credentials valid)
{
Session["login"] = username;
Response.Redirect("landingpage.aspx", false);
}
// landingpage.aspx
if (Session["login"] == null) // this will always be true
{
Response.Redirect("login.aspx", false);
return;
}
在 Global.cs 中,我为 4 个事件创建了一个日志条目:APPLICATION_START、APPLICATION_END、SESSION_START、SESSION_END。这是每个页面请求的日志结果。
Application Start
Session Start [asd...(session id 1)...qwe]
Session End [asd...(session id 1)...qwe]
Application End
有时同一个会话会在一个页面请求中启动和结束两次。
Application Start
Session Start [asd...(session id 1)...qwe]
Session End [asd...(session id 1)...qwe]
Session Start [asd...(session id 1)...qwe]
Session End [asd...(session id 1)...qwe]
Application End
从浏览器(Chrome)手动删除会话 cookie 后,下一个请求仍会创建会话 cookie 并触发事件。
Application Start
Session Start [zxc...(session id 2)...rty]
Session End [zxc...(session id 2)...rty]
Application End
配置/失败的解决方案
- 我尝试过使用 .NET 4.0 和 4.5 框架。
- 我使用的是 IIS7。
- 两种无 cookie 状态(真/假)产生相同的结果。
- 系统日志显示没有应用程序池重新启动。
- 我在 SESSION_START 事件中设置了一个虚拟变量。
//web.config
<compilation targetFramework="4.0"/>
<sessionState mode="InProc" timeout="30" cookieless="false"/>
//SESSION_START event
Session["SESSION_ALIVE"] = "SESSION_ALIVE";
我能感觉到我的头发为此变白了。帮助我的头皮,o' SO。
编辑
我已经找到了这种行为的确切原因。
1.当页面被请求时,Application_Start和Session_Start被触发。
2. 如果在 App_Code 文件夹中进行了任何操作(包括 查看 Visual Studio 中的文件),Session_End 和 Application_End 将被触发。我的猜测是这会以某种方式重新启动应用程序池。
我现在的问题是:
1. 为什么会这样?
2. 为什么我的session ID总是一样的?
3.会话cookie永远不会被破坏。这是故意的吗?
4. 是/否回答 3:为什么?
编辑 2
我发现了这种行为的真正原因(应用程序突然停止)。
有几种方法可以复制这一点。如果这很重要,我正在使用 VS2012。
1. 当 App_Code 文件的窗口在 Visual Studio 中获得焦点时。
2.当任何文件保存在项目中时,即使没有进行任何更改。
3. VS 预览窗口打开时。在解决方案资源管理器中选择任何代码文件时会发生这种情况。
这真的让我很困扰,我知道这不应该发生。我可以在做完其他所有事情后插入会话验证,但这只能解决症状而不是问题。另外,我知道这可能是一个新问题,但我不确定它是否有资格成为它自己的问题,所以我把它放在这里(现在可能?)。
【问题讨论】:
标签: c# asp.net session session-variables