Session.Abandon()和Session.Clear()有什么区别


109

销毁会话和删除其值之间有什么区别?您能否提供一个示例来说明这一点?

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

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

一位朋友告诉我:

清除会话不会取消会话的设置,它仍然具有相同的用户ID,但只清除了值。

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

以下代码有效,并且不会引发任何异常。

Session.Abandon();
Session["tempKey1"] = "tempValue1";

当您放弃会话时,您(或用户)将获得一个新的SessionId。

当我测试会话时,放弃会话时不会做任何更改。

我只是发现一个不同: session.Abandon()引发Session_End事件


5
Session.Clear立即删除项目,但是Session.Abandon将会话标记为在当前请求结束时被放弃。
RepDbg 2014年

Answers:


147

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

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

Session.Clear可以比作从架子移走所有书本,而Session.Abandon更像是将整个书架扔掉

你说:

当我测试会话时,放弃会话时不会做任何更改。

仅在一个请求中执行此操作时,这是正确的。
在下一个请求时,会话将有所不同。但是会话ID可以重复使用,因此ID将保持不变。

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

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

回到差异:

  1. 放弃引发Session_End请求。
  2. 清除会立即删除项目,而“放弃”则不会。
  3. Abandon释放SessionState对象及其项目,以便它可以回收垃圾以释放资源。清除将使SessionState和资源保持关联。

如果我打电话给session.clear(),您会再次告诉自己。不?(所有其他引发Session_End事件的事件)
后门

Session.Clear 只会从Session中删除项目。而已。您可以根据需要多次调用它。
Dmytrii Nagirniak

@AnthonyWJones,您说对了“毁灭”是不对的。最好从会话中删除对象。但是Session.Clear也不破坏对象,它从会话中删除了thm,以便可以对其进行垃圾回收。另外,不建议存储COMPLEX对象,否则我认为很好。
Dmytrii Nagirniak 2009年

@Dmitriy:为什么“不建议存储复杂对象”?
Kamarey

5
@Ads我同意,但我会说扩展它Session.Clear可以比较删除从货架上所有的书立即,而Session.Abandon更像是说“扔掉了整个货架,让我知道当你完成 ”。
WynandB 2014年

20

当您Abandon()进行会话时,您(或用户)将获得一个新的SessionId(在下一个请求时)。当你Clear()一个会议,所有存储的值将被删除,但会话ID保持不变。


3
谢谢。但是为了使Mattew Macdonalds预订,它可以使用相同的会话ID。我的意思是,如果web.config文件中configuration / system.web / sessionState元素处的regenerateExpiredSessionId属性为false,ASP.Net将使用旧的会话ID
后门

2
@Hans Kesting呼叫放弃时,他将不会获得新的会话ID。他必须将ASPNET_SessionID cookie显式设置为null才能获取新的Session ID。
Zo

9

这是那种通过以上各方面的反应覆盖,但我第一次读这篇文章,我错过了一个重要的事实,这导致我的代码一个小错误...

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

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

因此,就我而言(可能是您的情况),我需要Clear()紧随其后Abandon()


1
为什么需要Session.Clear()和Session.Abandon()?您正在清除要销毁的集合的值吗?这是完全多余的。确保会话对象不会立即被销毁(发生在当前请求的结尾),但是该会话ID将不再由任何后续请求提供。如果客户端确实提出了新请求,则将为他们提供新的会话。如果要访问Global.Asax的Session_End()事件中的任何会话变量,则首先调用Clear也会导致问题(因为您清除了它们,所以它们不存在)。
RepDbg 2014年

@RepDbg实际上我不同意。Session.Abandon()。为客户端提供新的会话ID。Session.clear清除了服务器上有关该会话的所有信息,因此没有其他用户可以使用。我同意NRC
Micah Armantrout

@ Micah Armantrout我没有遵循你的逻辑。为什么要使用Session.Clear()清除会话,然后调用Session.Abandon()不仅清除会话,又将其完全取消分配?Session.Abandon()也不给客户端新的会话ID。后续请求将满足但不满足调用Session.Abandon()的请求。
RepDbg

如果仅使用Session.Abandon,则ASP.NET管道中的其他其余逻辑仍可以访问当前会话值。
Mark Sowul '18年

6

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

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

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

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

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

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

MSDN Session.Abandon


3

清除会话会删除在那里存储的值,但是您仍然可以在其中添加新值。销毁会话后,您无法在其中添加新值。


谢谢,但是这有效:(与您的想法不一致)Session.Abandon(); Session [“ tempKey1”] =“ tempValue1”; Response.Write(Session [“ tempKey1”]。ToString());
后门

这样做是因为实际上刷新页面后,会话将被破坏。会话ID(通常)存储在Cookie中。
RaYell

我不明白。我的意思是,在我调用Session.Abandon()之后,我仍然可以为其添加值。(即使页面回发并再次呈现)。
后门

1
您可能已将会话设置为在销毁ID后自动重新生成ID。因此,当您为销毁的会话分配值时,将自动生成新会话。
RaYell

1
是的,使用此会话ID会重新生成,但是我的问题是:session.clear()和session.abandone()之间有什么区别。这样,当将autoregenerate设置为false时,这些拖曳不会在提高Sesion_End的任何其他方面有所不同?
后门

3

clear-its从会话状态集合中删除键或值。

放弃-从会话中删除或删除会话对象。


1
Session.Abandon() 

将破坏/杀死整个会话。

Session.Clear()

删除/清除会话数据(即当前会话中的键和值),但该会话仍处于活动状态。

与Session.Abandon()方法相比,Session.Clear()不会创建新的会话,它只是将会话中的所有变量设置为NULL。

在两种情况下,只要未关闭浏览器,会话ID都将保持不变。

Session.RemoveAll()

它从会话状态集合中删除所有键和值。

Session.Remove()

它从会话状态集合中删除一个项目。

Session.RemoveAt()

它从会话状态集合中删除指定索引处的项目。

Session.TimeOut()

此属性指定为应用程序分配给Session对象的超时时间。(时间将以分钟为单位指定)。

如果用户在超时时间内没有刷新或请求页面,则会话结束。



0

我认为使用Session.Clear()而不是使用会很方便Session.Abandon()

因为这些值在稍后调用之后仍然存在于会话中,但是在调用前者之后将被删除。


0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

这里要注意的一件事是,Session.Clear立即删除项目,但Session.Abandon标记为在当前请求结束时放弃该会话。这只是意味着,假设您在执行session.abandon命令之后立即尝试访问代码中的值,该值仍然存在。因此,即使发出session.abandon命令并立即对会话进行一些逻辑处理后,代码也无法正常工作,请不要感到困惑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.