【问题标题】:lost session state in ASP.NETASP.NET 中丢失的会话状态
【发布时间】:2019-07-18 09:23:50
【问题描述】:

我是 ASP.NET 的初学者,只是一个关于会话状态的问题。我正在读一本教科书,上面写着:

如果用户关闭并重新启动浏览器并且会话实际上保留在 Web 服务器的内存中,会话状态将丢失,因为 ASP.NET 不知道客户端已关闭浏览器或更改了窗口。会话将留在内存中,保持无法访问,直到最终过期

我不太明白“remaining inaccessible”是什么意思,因为第一次在客户端机器上使用会话集合时会创建一个名为“ASP.NET_SessionId”的cookie,所以即使用户关闭并且然后重新启动他们的浏览器并再次访问该页面,因此包含会话 id 的 cookie 仍然会被发送到服务器,如果会话仍然保留在 Web 服务器的内存中,为什么它无法访问?

【问题讨论】:

  • @WildWind "ASP.NET_SessionId" 是作为会话 cookie 创建的,所以从技术上讲,它永远不会“过期”......您可能的意思是“仍然存在”而不是“未过期”。

标签: c# asp.net session webforms


【解决方案1】:

ASP.NET_SessionId cookie 被创建为“会话 cookie”(不是“持久”之一 - How do I create a persistent vs a non-persistent cookie?),当浏览器完全关闭时(现在很少发生)浏览器将丢弃所有“会话”cookie。由于 cookie 的值是加密安全的随机数,因此没有实用的方法来重建 cookie 的值并因此从服务器检索旧会话的值。与 cookie 的值关联的数据将位于服务器的内存中(如果使用 SQL 会话状态,则存储在 SQL 中),但不会有任何请求可以请求它。最终,当服务器端过期(或服务器 IIS 进程在内存会话状态下关闭)时,数据将被清除。

请注意,当您关闭所有实例时,大多数现代浏览器实际上并没有“关闭会话”,因此您在实践中很少看到这种情况。您可以随时“清除所有 cookie”来查看它的发生情况。

【讨论】:

  • ASP.NET_SessionId 的内容是一个安全的随机数,但这是 Web 服务器唯一需要的会话数,不是吗?所以当我使用会话并关闭浏览器时,我可以看到 ASP.NET_SessionId 仍然存在(20分钟),那么为什么如果我再问一个问题,服务器就无法再次访问会话?
  • @amjad 你在哪里“可以看到 ASP.NET_SessionId 仍然存在”?您询问的原始陈述是针对浏览器完全失去该价值的情况。如果您使用该 cookie 保存请求(即使用 Fiddler),您可以针对服务器重播它,服务器将使用存储在会话状态中的相同数据(只要它在服务器端没有过期/丢失)......也不清楚你的意思是“如果我问另一个问题”。旁注:“会话状态”和“会话 cookie”是不相关的概念,唯一共同点是 ASP.Net 会话状态使用会话 cookie 来存储 id。
  • 好的,你的意思是每次我们关闭浏览器,asp.net session id都会被删除。但是假设我写下这个会话ID并将其发送给我的朋友,那么当他尝试向服务器发出请求时,服务器会将我的信息显示给他?
  • @amjad 是的,该 cookie 的值是唯一 ID 服务器需要使用相同的会话数据。如果您获取价值并将其发送给您的朋友,他们确实可以从您的会话中访问与该 cookie 相关联的数据(只要您的朋友对 Fiddler 等 HTTP 工具有一些基本知识,或者至少能够使用 Google/Bing 进行“设置 cookie按名称使用 JavaScript")
猜你喜欢
  • 2021-03-03
  • 2016-10-21
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 2012-02-01
  • 2017-09-20
相关资源
最近更新 更多