C#清除会话

时间:2011-07-10 09:43:34

标签: c# .net asp.net session page-lifecycle

问题#1

我想知道我应该何时使用:

  

Session.Abandon() //当我在跟踪期间和调用它之后使用它时 - 我发现会话仍然有值。

我应该何时使用:

  

Session.Clear()

我应该何时使用每种特定方法?


  • 总的来说?
  • 在我的具体情况下?

我在Page Load中检查session是否不等于null。如果session等于null,我想清除会话并重定向到登录页面?

我应该使用这样的东西:

private void initSession()
{
    Session.Clear();
    Session.Abandon();
    Response.Redirect("LoginPage.aspx");
}

3 个答案:

答案 0 :(得分:93)

In ASP.NET, when should I use Session.Clear() rather than Session.Abandon()?

  

Session.Abandon()会破坏会话   而Session_OnEnd事件是   触发。

     

Session.Clear()只删除所有内容   来自Object的值(内容)。该   仍然使用相同的密钥进行会话   活着。

     

所以,如果您使用Session.Abandon(),那么   失去那个特定的会话和   用户将获得一个新的会话密钥。您   可以使用它,例如当用户   退出。

     

如果需要,请使用Session.Clear()   用户保持在同一会话中   (如果你不想让他重新登录   例子)并重置他所有的会话   具体数据。

What is the difference between Session.Abandon() and Session.Clear()

  

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

     

放弃 - 删除所有对象   存储在会话中。如果你不   明确地调用Abandon方法,   服务器删除这些对象和   在会话中销毁会话   超时它也引发了诸如此类的事件   Session_End中。

     

Session.Clear可以与之比较   从书架上取下所有书籍,   而Session.Abandon则更像   丢掉整个架子。

     

...

     

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

     

回到差异:

     
      
  • Abandon引发了Session_End请求。
  •   
  • 清除会立即删除项目,放弃不会。
  •   
  • Abandon释放SessionState对象及其项目,因此它可以是垃圾   集。
  •   
  • Clear保持SessionState和与之关联的资源。
  •   

Session.Clear() or Session.Abandon() ?

  

如果不这样做,请使用Session.Clear()   想要结束会议而是   只需清除会话中的所有键   并重新初始化会议。

     

Session.Clear()不会导致   你的Session_End eventhandler   要执行的Global.asax文件。

     

但另一方面   Session.Abandon()将删除   会话一共完成并将执行   Session_End eventhandler。

     

Session.Clear()就像删除书籍一样   从书架上

     

Session.Abandon()就像扔掉了   书架本身。

<强>问题

如果在页面加载中不等于null,我会检查一些会话。如果其中一个等于null我想清除所有会话并重定向到登录页面?

<强>答案

如果您希望用户再次登录,请使用Session.Abandon。

答案 1 :(得分:3)

在网上发现这篇文章,与此主题非常相关。所以发帖在这里。

ASP.NET Internals - Clearing ASP.NET Session variables

答案 2 :(得分:3)

另一个很大的区别是Abandon不会立即删除项目,但是当它执行清理时它会对会话项执行循环以检查它需要特别处理的STA COM对象。 这可能是个问题。

在高负载下,两个(或更多)请求可能会在同一会话中将其发送到服务器(即具有相同会话cookie的两个请求)。它们的执行将被序列化,但由于Abandon没有同步清除项目,而是设置了一个标志,两个请求都可以运行,并且两个请求都安排工作项“以后”清除会话。这两个工作项然后可以同时运行,并且都检查会话对象,并且两者都清除对象数组,当你有两个东西迭代列表并更改它时会发生什么?繁荣!因为这发生在queueuserworkitem回调中并且不是在try / catch中完成的(感谢MS),它将关闭整个应用程序域。去过那里。