15

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

4

5 回答 5

34

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

引用自MSDN

会议活动

ASP.NET 提供了两个事件来帮助您管理用户会话。Session_OnStart 事件在新会话开始时引发,Session_OnEnd 事件在会话被放弃或到期时引发。会话事件在 ASP.NET 应用程序的 Global.asax 文件中指定。

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

于 2009-05-12T14:07:04.490 回答
13

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

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

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

于 2009-05-12T14:05:41.500 回答
1

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

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

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

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

于 2009-05-12T14:08:17.937 回答
1

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

<sessionState regenerateExpiredSessionId="true">
于 2009-05-12T19:35:05.930 回答
0

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

于 2009-05-12T14:22:03.480 回答