Session.Abandon()和Session.Clear()之间的区别是什么

bac*_*oor 103 asp.net session asp.net-session

销毁会话和删除其值有什么区别?你能举一个证明这个的例子吗?

我搜索了这个问题,但没有掌握全部答案.一些答案是:

  • Session.Abandon() 破坏会话
  • Session.Clear() 只删除所有值

一位朋友告诉我这个:

清除会话不会取消设置会话,它仍然存在与用户相同的ID,但只是清除了值.

放弃将完全破坏会话,这意味着您需要先开始一个新会话,然后才能在该会话中为该用户存储更多值.

以下代码有效,不会抛出任何异常.

Session.Abandon();
Session["tempKey1"] = "tempValue1";
Run Code Online (Sandbox Code Playgroud)

当您放弃会话时,您(或更确切地说是用户)将获得一个新的SessionId

当我测试Session时,当我放弃会话时它不会做任何改变.

我发现一个区别: session.Abandon()引发Session_End事件

Dmy*_*iak 140

清除 - 从会话状态集合中删除所有键和值.

放弃 - 删除会话中存储的所有对象.如果未显式调用Abandon方法,则服务器会在会话超时时删除这些对象并销毁会话.
它还引发了Session_End等事件.

可以将Session.Clear与从架子移除所有书籍进行比较,而Session.Abandon更像是丢掉整个架子.

你说:

当我测试Session时,当我放弃会话时它不会做任何改变.

只在一个请求中执行此操作时,这是正确的.
在下一个请求中,会话将是不同的.但是可以重用会话ID,以便id保持不变.

如果您将使用Session.Clear,您将在许多请求中拥有相同的会话.

通常,在大多数情况下,您需要使用Session.Clear.
如果您确定用户将要离开您的站点,您可以使用Session.Abandon.

所以回到差异:

  1. 放弃引发Session_End请求.
  2. Clear会立即删除项目,Abandon不会.
  3. 放弃释放SessionState对象及其项目,以便可以收集垃圾以释放资源.Clear保持SessionState和与之关联的资源.

  • @Ads我同意,虽然我会扩展它,说`Session.Clear`可以比作从书架上删除所有书籍_immediately_,而`Session.Abandon`更像是说"扔掉整个架子_让我知道当你完成了"". (5认同)

Han*_*ing 19

当您Abandon()进行会话时,您(或者更确切地说是用户)将获得新的SessionId(在下一个请求中).当您Clear()使用会话时,将删除所有存储的值,但SessionId保持不变.

  • 谢谢.但是对mattew macdonalds书来说,它可以使用相同的会话ID.我的意思是,如果web.config文件中的configuration/system.web/sessionState元素的regenerateExpiredSessionId属性为false,则ASP.Net使用旧的会话ID (3认同)
  • @Hans Kesting调用放弃时,他将不会获得新的会话ID。他必须将ASPNET_SessionID cookie显式设置为null才能获取新的Session ID。 (2认同)

小智 9

有点被上面的各种回答所覆盖,但是我第一次阅读这篇文章时,我错过了一个重要的事实,这导致了我的代码中的一个小错误......

Session.Clear() 将清除所有键的值,但不会导致会话结束事件触发.

Session.Abandon()不会清除当前请求的值.如果请求另一个页面,则该值将消失.然而,放弃将抛出事件.

那么,在我的情况下(也许在你的情况下?),我需要Clear()跟随Abandon().


Sev*_*ven 6

此代码有效,并且不会引发任何异常:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";
Run Code Online (Sandbox Code Playgroud)

这是因为,当调用Abandon方法时,当前的Session对象排队等待删除,但直到处理完当前页面上的所有脚本命令后才真正删除。这意味着您可以在与Abandon方法调用相同的页面上访问存储在Session对象中的变量,但不能在任何后续Web页面中访问。

例如,在下面的脚本中,第三行显示值Mary。这是因为在服务器完成脚本处理之前,Session对象不会被销毁。

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>
Run Code Online (Sandbox Code Playgroud)

如果您在随后的网页上访问变量MyName,则该变量为空。这是因为当包含上一个示例的页面完成处理时,MyName被上一个Session对象破坏了。

MSDN Session.Abandon