对于每个页面请求,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
//web.config
<compilation targetFramework="4.0"/>
<sessionState mode="InProc" timeout="30" cookieless="false"/>
//SESSION_START event
Session["SESSION_ALIVE"] = "SESSION_ALIVE";
我能感觉到我的头发因此而灰白。帮助我的头皮,o&#39; SO。
修改
我找到了这种行为的确切原因
1.请求页面时,Application_Start
和Session_Start
被解雇
2.如果在App_Code文件夹中完成了任何操作(包括在Visual Studio中查看文件),则会触发Session_End
和Application_End
。我猜这是以某种方式重新启动应用程序池。
我现在的问题是:
1.为什么会这样?
2.为什么我的会话ID总是一样的?
3.会话cookie永远不会被销毁。这是打算吗?
4.是/否回答3:为什么?
编辑2
我发现了这种行为的真正原因(应用程序突然停止)
有几种方法可以复制它。如果重要,我会使用VS2012
1.当App_Code文件的窗口在Visual Studio中获得焦点时
2.当任何文件保存在项目中时,即使没有进行任何更改
3.打开VS预览窗口时。在解决方案资源管理器中选择任何代码文件时会发生这种情况。
这真让我烦恼,我知道它不应该发生。我可以在完成所有其他操作后插回会话验证,但只能解决症状而不是问题。此外,我知道这可能是一个新问题,但我不确定它是否有资格成为自己的问题所以我把它放在这里(现在可能?)。
答案 0 :(得分:0)
你似乎正确地做到了。但是,我想知道更多。
您的代码中是否包含以下任何内容?
Session.Abandon Session.RemoveAll(或任何删除方法)
您是否设置了明确的会话超时时间而不是默认值?
您的应用程序是否托管在多台服务器中?负载平衡等。
如果您发布Global.asax.cs代码会有所帮助。
或者,您可以尝试使用以下代替 Session[key] = val;
HttpContext.Current.Session[key] = val;
答案 1 :(得分:-3)
尝试在web.config中添加此内容
<system.web>
<sessionState mode="StateServer"></sessionState>
</system.web>