当 Session.Abandon() 不起作用时,如何以编程方式结束 asp.net 中的会话?

Posted

技术标签:

【中文标题】当 Session.Abandon() 不起作用时,如何以编程方式结束 asp.net 中的会话?【英文标题】:How do you programmatically end a session in asp.net when Session.Abandon() doesn't work? 【发布时间】:2010-10-25 13:46:52 【问题描述】:

Session.Abandon() 似乎没有做任何事情。你会期望 Session_end 事件在 Session.Abandon() 被调用时触发。

【问题讨论】:

【参考方案1】:

这很可能是因为您的SessionMode不是InProc(唯一可以检测到会话何时结束的)。

引用自MSDN:

会话事件

ASP.NET 提供了两个事件来帮助 您管理用户会话。这 Session_OnStart 事件在发生时引发 新会话开始,并且 Session_OnEnd 事件在发生时引发 会话被放弃或过期。 会话事件在 用于 ASP.NET 的 Global.asax 文件 申请。

Session_OnEnd 事件不是 如果会话模式属性支持 设置为 InProc 以外的值, 这是默认模式。

【讨论】:

@Syaz:这完全解释了没有引发 Session.OnEnd 事件的原因!更重要的是,OP已经接受了它,所以我认为你几乎不能有效地争论...... @Noldorin 我已经调整了标题以匹配真正的问题。【参考方案2】:

Session.Abandon() 是结束会话的方法。您遇到了什么问题?

如果它的后退按钮相关,那是一个完全不同的问题(页面不会在返回时回发,而是从客户端缓存运行一个,因此不会执行服务器端方法)。

此外,Session_End 是有问题的。它只会在使用 InProc 会话时在 Session.Abandon() 上触发,因此如果您使用不同的 Session 模式,则不能依赖它。否则, Session_End 将在达到 SessionTimeout 时触发(我相信默认为 20 分钟,在 Web.Config 中配置)。

【讨论】:

【参考方案3】:

您是否尝试过使用以下内容?

System.Web.Security.FormsAuthentication.SignOut();

这将清除用于表单身份验证的 cookie,尽管可能不是您想要的。

您可能需要在 Session.Abandon() 之外使用它

【讨论】:

【参考方案4】:

如果会话似乎持续存在,您可以尝试(在 web.config 中):

<sessionState regenerateExpiredSessionId="true">

【讨论】:

谁能解释一下这会做什么? MSDN不清楚msdn.microsoft.com/en-us/library/…【参考方案5】:

这取决于,如果您的应用程序位于 2 个服务器上:1 个 Web 应用程序有自己的会话,第二个 WS 或 WCF 应用程序也有自己的会话,它在我曾经工作过的应用程序中的情况如何。如果你有这种情况,会话必须在第二点结束,第一个结束时会出现超时。至少您必须使用令牌并保留令牌列表和活动会话。可能是你的情况。祝你好运。 PS。要终止会话,请在第二个服务器中对其进行管理。

【讨论】:

以上是关于当 Session.Abandon() 不起作用时,如何以编程方式结束 asp.net 中的会话?的主要内容,如果未能解决你的问题,请参考以下文章

Session.Abandon 调用后 SessionID 仍然相同

Session.Abandon和Session.Clear的区别

session.invalidate()和session.abandon()有啥不同,该如何选择?

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

Session.Abandon-Session.Clear-Session.RemoveAll

在 ASP.NET 中的 Session.Clear() 和 Session.Abandon() 之后会话变量未清除