如何终止会话或会话ID(ASP.NET/C#)

如何终止会话或会话ID(ASP.NET/C#),c#,asp.net,session,razor,webmatrix,C#,Asp.net,Session,Razor,Webmatrix,当用户单击注销按钮时,如何销毁会话(会话[“名称”]) 我正在查看MSDN上的ASP.NET API参考,它似乎没有太多信息。这似乎相当有限。但是我找不到ASP.NET类等的任何其他页面 我试过: Session.放弃()和 Session.Contents.Remove(“名称”)它们都不起作用。(我在一个论坛的谷歌搜索中发现了这些)放弃方法应该可以工作(): 如果要从会话中删除特定项,请使用(): 编辑:如果只想清除某个值,可以执行以下操作: Session["YourItem"] = nu

当用户单击注销按钮时,如何销毁会话(会话[“名称”])

我正在查看MSDN上的ASP.NET API参考,它似乎没有太多信息。这似乎相当有限。但是我找不到ASP.NET类等的任何其他页面

我试过:

Session.放弃()
Session.Contents.Remove(“名称”)它们都不起作用。(我在一个论坛的谷歌搜索中发现了这些)

放弃方法应该可以工作():

如果要从会话中删除特定项,请使用():

编辑:如果只想清除某个值,可以执行以下操作:

Session["YourItem"] = null;
如果要清除所有键,请执行以下操作:

Session.Clear();
如果这些都不适合你,那么就有可疑的事情发生了。我会检查您分配值的位置,并在清除值后验证它是否没有被重新分配

简单的检查方法:

Session["YourKey"] = "Test";  // creates the key
Session.Remove("YourKey");    // removes the key
bool gone = (Session["YourKey"] == null);   // tests that the remove worked
会话。放弃()
这将销毁数据

请注意,这并不一定会真正从用户中删除会话令牌,并且该会话令牌可能会在稍后被拾取并创建为具有相同id的新会话,因为它被认为是公平的游戏。


这将会话标记为已放弃,但此时会话实际上不会被放弃,请求必须首先完成

您可以这样终止会话:

Session.Abandon()
但是,如果您只想清空会话,请使用:

Session.Clear()
这是你应该使用的。事情是在幕后的asp.net会破坏会话,但会在下一页请求时立即给用户一个全新的会话。因此,如果您在呼叫放弃后立即检查会话是否已结束,它将看起来不起作用。

根据我的测试:

Session.Abandon(); // Does nothing
Session.Clear();   // Removes the data contained in the session

Example:
001: Session["test"] = "test";
002: Session.Abandon();
003: Print(Session["test"]); // Outputs: "test"
放弃只将会话对象中的布尔标志设置为true。调用web服务器可能对此做出反应,但ASP不会立即执行任何操作。 (我自己用.net Reflector检查过)

事实上,您可以通过点击浏览器的后退按钮继续使用旧会话,并继续正常浏览整个网站

因此,总结一下:使用Session.Clear()并避免沮丧

备注:我已经在ASP.net开发服务器上测试过这种行为。实际的IIS可能会有不同的行为

Session["YourItem"] = "";
在.NETRazor网页中效果非常好。

Session.about()对我也不起作用

为了让它工作,我不得不这样写。也许对你也有用

HttpContext.Current.Session.Abandon();

指示客户端浏览器清除会话id cookie值也是一个好主意

Session.Clear();
Session.Abandon();
Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-10);

谢谢,@Kelsey;我刚刚更新了我的问题,以显示我已经尝试了什么。Abaundon方法不起作用:S@Lucifer你是想从当前会话中杀死
会话
,还是想从应用程序级别上杀死某个特定会话?嗯,从当前会话中,Lucifer,我怀疑还有其他事情发生。我已经编辑了我的答案,包括一个小检查和一些其他选项。@Lucifer你期望得到什么结果?删除
后,该值将为
null
。你想让更多的事情发生吗?你说的“两个都不起作用”是什么意思。。。当我输出会话[“Name”]的内容时,它仍然输出名称,但不应该输出,因为它应该被清除或终止。而且它没有让我退出。因此,这就是我所说的“两者都不起作用”的意思。尝试将重定向添加回登录页面,检查其中的会话[“Name”]可能会对您有所帮助。Abaundon方法可以工作您只需从html脚本中获取postbackurl,并在会话后添加重定向。放弃()。如果您只是尝试删除“Name”,您可以执行
Session.Remove(“Name”)
或使用
会话[“Name”]=null清除它这些都不起作用。我已经试过会话。放弃();会话。内容。删除(“名称”);Session.Contents.RemoveAll();Session.Clear();会话[“Name”]=null(这是我最初做的)-它们都不起作用。谢谢@Chris,我试过了,它仍然输出会话[“Name”]的内容,并且不会注销。检查MSDN文档上的备注部分了解会话。放弃->谢谢@AlanB-然后,如果会话不会被删除,我如何在单击“注销”按钮后立即注销我的“帐户”?我想这取决于您正在执行的代码,但基本操作是如果您在代码中执行会话的页面上有“注销”按钮。放弃()调用然后重定向到您的主页。主页的加载应该有一个新的会话,因此不再“登录”。他们将有一个新会话,但与旧会话相关的所有数据都已丢失。虽然此代码示例可能会回答此问题,但最好对您的答案进行一些必要的解释。现在看来,这个答案对未来的读者几乎没有任何价值。这真的有必要吗?Response.Cookies[“ASP.NET\u SessionId”]。Value=string.empty?或者只使用Session.discard()就足够了?
Session["YourItem"] = "";
HttpContext.Current.Session.Abandon();
Session.Clear();
Session.Abandon();
Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-10);