C# 会话在每次请求时开始和结束,每次都使用相同的会话ID 异常

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

对于每个页面请求,都会触发会话启动,紧接着是会话结束。如果会话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
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_EndApplication_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.