C# 会话在每次请求时开始和结束,每次都使用相同的会话ID 异常
对于每个页面请求,都会触发会话启动,紧接着是会话结束。如果会话cookie不存在,则会自动创建一个(新SessionId),并触发两个事件。如果会话cookie已经存在,则使用相同/旧的SessionId。即使会话cookie存在,每个请求上的会话变量都会丢失 描述 我有一个简单的登录页面,它存储登录会话,并重定向到登录页面。在登录页面上,我检查会话变量是否存在,如果不存在,则将用户重定向到登录页面C# 会话在每次请求时开始和结束,每次都使用相同的会话ID 异常,c#,asp.net,session,session-variables,C#,Asp.net,Session,Session Variables,对于每个页面请求,都会触发会话启动,紧接着是会话结束。如果会话cookie不存在,则会自动创建一个(新SessionId),并触发两个事件。如果会话cookie已经存在,则使用相同/旧的SessionId。即使会话cookie存在,每个请求上的会话变量都会丢失 描述 我有一个简单的登录页面,它存储登录会话,并重定向到登录页面。在登录页面上,我检查会话变量是否存在,如果不存在,则将用户重定向到登录页面 // login.aspx if (credentials valid) { Sessi
// 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
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
有时,同一个会话在一个页面请求中启动和结束两次
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
配置/失败的解决方案
- 我尝试过使用.NET4.0和4.5框架
- 我用的是IIS7
- 两种无cookieless状态(真/假)产生相同的结果
- 系统日志显示没有应用程序池重新启动
- 我在SESSION\u START事件中设置了一个伪变量
//web.config
//会话启动事件
Session[“Session\u ALIVE”]=“Session\u ALIVE”;
我能感觉到我的头发因为这个而变白了。帮帮我的头皮,好吧
编辑我已经找到了这种行为的确切原因。
1.请求页面时,
Application\u Start
和Session\u Start
将被触发。2.如果在App_Code文件夹(包括在visual studio中查看文件)中执行了任何操作,
Session_End
和Application_End
。我猜这会以某种方式重新启动应用程序池
我现在的问题是:1.为什么会发生这种情况?
2.为什么我的会话ID总是相同的?
3.会话cookie永远不会被销毁。这是有意的吗?
4.是/否回答3:为什么 编辑2
我已经发现了这种行为的真正原因(应用程序突然停止)。
有几种方法可以复制这一点。如果有必要,我将使用VS2012。
1.当应用程序代码文件的窗口在Visual Studio中接收焦点时。
2.在项目中保存任何文件时,即使未进行任何更改。
3.当VS预览窗口打开时。在解决方案资源管理器中选择任何代码文件时,都会发生这种情况
这真的让我很烦恼,我知道这不应该发生。我可以在完成所有其他操作后重新插入会话验证,但这只能解决症状,而不是问题。另外,我知道这可能是一个新问题,但我不确定它是否符合自己的问题,所以我把它放在这里(现在可能?)。你似乎做得对。但是,我想知道更多一点 您的代码中是否有以下内容 会话。放弃 Session.RemoveAll(或任何删除方法) 您是否设置了任何显式会话超时而不是默认设置 您的应用程序是否托管在多个服务器上?负载平衡等 如果您发布您的Global.asax.cs代码将非常有用 或者,您可以尝试使用以下命令代替
会话[key]=val代码>
HttpContext.Current.Session[key] = val;
你似乎做得对。但是,我想知道更多一点
您的代码中是否有以下内容
会话。放弃
Session.RemoveAll(或任何删除方法)
您是否设置了任何显式会话超时而不是默认设置
您的应用程序是否托管在多个服务器上?负载平衡等
如果您发布您的Global.asax.cs代码将非常有用
或者,您可以尝试使用以下命令代替会话[key]=val代码>
HttpContext.Current.Session[key] = val;
尝试将此添加到web.config中
<system.web>
<sessionState mode="StateServer"></sessionState>
</system.web>
尝试将其添加到web.config中
<system.web>
<sessionState mode="StateServer"></sessionState>
</system.web>
我已尝试添加会话。在创建新的“登录”会话变量之前放弃,但无效。唯一设置的place会话超时在web.config文件中。无负载平衡/网络农场;这是一个单线程应用程序。Global.cs文件只记录事件,但SESSION_START除外,它在会话中添加了一个虚拟变量。@ttj:您在哪里使用了SESSION.advand?因为,我们应该只在Session\u End或Application\u End中使用它代码>。最初它不在那里;这只是我试图解决的问题之一,不管发生什么。好的,把它去掉。这不会有什么帮助,因为在执行所有代码之前,会话只排队等待删除。更多信息@1。如果更改web.config之类的从属文件,应用程序将被回收,应用程序将被触发。2.以下链接将帮助您回答问题3和4。上面的链接也会回答这些问题,希望这有所帮助。我已经尝试添加会话。在创建新的“登录”会话变量之前放弃,但没有效果。唯一设置的place会话超时在web.config文件中。无负载平衡/网络农场;这是一个单线程应用程序。Global.cs文件只记录事件,但SESSION_START除外,它在会话中添加了一个虚拟变量。@ttj:您在哪里使用了SESSION.advand?因为,我们应该只在Session\u End或Application\u End中使用它代码>。最初它不在那里;这只是我试图解决的问题之一,不管发生什么。好的,把它去掉。这不会有什么帮助,因为在执行所有代码之前,会话只排队等待删除。更多信息@1。如果更改web.config之类的从属文件,应用程序将被回收,应用程序将被触发。2.