【问题标题】:Session starts and ends on every request, same session ID each time会话在每个请求上开始和结束,每次相同的会话 ID
【发布时间】: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_StartSession_Start被触发。
2. 如果在 App_Code 文件夹中进行了任何操作(包括 查看 Visual Studio 中的文件),Session_EndApplication_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


    【解决方案1】:

    尝试将其添加到您的 web.config 中

    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
    

    【讨论】:

      【解决方案2】:

      你似乎做得对。但是,我想知道更多。

      您的代码中是否有以下任何内容?

      会话.放弃 Session.RemoveAll(或任何删除方法)

      您是否设置了任何明确的会话超时而不是默认设置?

      您的应用程序是否托管在多个服务器上?负载均衡等

      如果您发布 Global.asax.cs 代码会有所帮助。

      或者,您可以尝试使用关注而不是 Session[key] = val;

      HttpContext.Current.Session[key] = val;
      

      【讨论】:

      • 我尝试在创建新的“登录”会话变量之前添加 Session.Abandon 无效。设置会话超时的唯一位置是在 web.config 文件中。没有负载平衡/网络农场;这是一个单线程应用程序。 Global.cs 文件只记录除 SESSION_START 之外的事件,它将一个虚拟变量添加到会话中。
      • @ttj:你在哪里使用 Session.Abandon?因为,我们应该只在 Session_End 或 Application_End 中使用它。
      • 就在Session["login"] = username; 之前。它最初不存在。这只是我试图解决的问题之一,无论如何都会发生。
      • 好的,删除它。这不会有帮助,因为会话只是排队等待删除,直到所有代码都被执行。更多信息@msdn.microsoft.com/en-us/library/ms524310(v=vs.90).aspx
      • 1.如果您更改 web.config 之类的依赖文件,应用程序将被回收并且 application_end 将被触发。 2. 以下链接将帮助您回答这个问题stackoverflow.com/questions/5912126/…forums.asp.net/t/1532145.aspx 3 和 4。以上链接也将回答这些问题,希望对您有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多