ASP.NET:Session.SessionID在请求之间更改

Seb*_*son 134 asp.net session sessionid

为什么ASP.NET页面中Session -object 上的属性SessionID在请求之间发生变化?

我有一个这样的页面:

...
<div>
    SessionID: <%= SessionID %>
</div>
...
Run Code Online (Sandbox Code Playgroud)

每次我点击F5时输出都会不断变化,与浏览器无关.

Cla*_*edi 209

这就是原因

使用基于cookie的会话状态时,在使用Session对象之前,ASP.NET不会为会话数据分配存储空间.结果,为每个页面请求生成新的会话ID,直到访问会话对象.如果您的应用程序需要整个会话的静态会话ID,您可以在应用程序的Global.asax文件中实现Session_Start方法,并将数据存储在Session对象中以修复会话ID,或者您可以在您的另一部分使用代码应用程序在Session对象中显式存储数据.

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

基本上,除非您在后端访问会话对象,否则将为每个请求生成一个新的sessionId

编辑

必须在Global.asax文件中添加此代码.它会向Session对象添加一个条目,以便您修复会话直到它到期为止.

protected void Session_Start(Object sender, EventArgs e) 
{
    Session["init"] = 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不知道,从来没有遇到过这个问题,但知道这很有趣 (21认同)
  • 我注意到只需将Session_Start方法与我的Global.asax中的NOTHING一起添加就可以了.谢谢@Claudio的提示. (7认同)
  • 有趣的是,这解决了我的问题 - 但问题只是在使用代码库大约6个月后才出现问题.我想不出有什么理由会突然改变 - 有人能说出为什么sessionid会在以前没有突然重置的原因吗? (2认同)
  • @KumarHarsh:一旦你在会话上存储任何对象,会话ID就会被修复.这就是我的意思,"除非你在后端访问你的会话对象......".一旦你指定`someid`会话将保持不变.考虑到这个答案超过4年,不确定是否有任何相关的修改. (2认同)

Nev*_*ook 88

还有另一个更阴险的原因,即使在Cladudio演示的Session对象初始化时,为什么会出现这种情况.

在Web.config中,如果有一个<httpCookies>条目设置为requireSSL="true"但您实际上并未使用HTTPS:对于特定请求,则会话cookie不会发送(或者可能不会返回,我不确定哪个)这意味着什么您最终会为每个请求提供一个全新的会话.

我发现这个很难,在源代码控制中的几次提交之间花了几个小时来回,直到我发现哪些特定的更改破坏了我的应用程序.

  • 我知道这一点,但仍然每 3 个月左右忘记一次,并花几个小时进行调试。 (5认同)

Kni*_*lke 5

在我的情况下,我发现会话cookie有一个包含前缀的www.,而我正在请求没有的页面www..
添加www.到URL立即修复了问题.后来我将cookie的域名改为设置为.mysite.com而不是www.mysite.com.


jos*_*osh 5

我的问题是我们在 web.config 中设置了这个

<httpCookies httpOnlyCookies="true" requireSSL="true" />

这意味着在非 SSL(默认)中调试时,auth cookie 不会被发送回服务器。这意味着服务器会为每个请求向客户端发送一个新的 auth cookie(带有新会话)。

修复方法是在 web.config 中将 requiressl 设置为 false 并在 web.release.config 中设置为 true 或在调试时打开 SSL:

开启 SSL