会话在每个请求上开始和结束,每次都是相同的会话ID

时间:2014-03-17 02:53:16

标签: c# asp.net session session-variables

异常

对于每个页面请求,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状态(true / false)都会产生相同的结果。
  • 系统日志显示没有应用程序池重新启动。
  • 我在SESSION_START事件中设置了一个虚拟变量。
 
//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_StartSession_Start被解雇  2.如果在App_Code文件夹中完成了任何操作(包括在Visual Studio中查看文件),则会触发Session_EndApplication_End。我猜这是以某种方式重新启动应用程序池。

我现在的问题是:
 1.为什么会这样?  2.为什么我的会话ID总是一样的?
 3.会话cookie永远不会被销毁。这是打算吗?
 4.是/否回答3:为什么?

编辑2
我发现了这种行为的真正原因(应用程序突然停止) 有几种方法可以复制它。如果重要,我会使用VS2012  1.当App_Code文件的窗口在Visual Studio中获得焦点时  2.当任何文件保存在项目中时,即使没有进行任何更改  3.打开VS预览窗口时。在解决方案资源管理器中选择任何代码文件时会发生这种情况。

这真让我烦恼,我知道它不应该发生。我可以在完成所有其他操作后插回会话验证,但只能解决症状而不是问题。此外,我知道这可能是一个新问题,但我不确定它是否有资格成为自己的问题所以我把它放在这里(现在可能?)。

2 个答案:

答案 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>