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

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

【问题讨论】:

    标签: c# asp.net authentication session membership


    【解决方案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">
        

        【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2013-10-28
          • 1970-01-01
          • 1970-01-01
          • 2012-04-20
          • 1970-01-01
          • 2017-09-13
          • 2016-04-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多