【问题标题】:Why Session_End event not raised when StateProvider is not InProc?为什么当 StateProvider 不是 InProc 时不引发 Session_End 事件?
【发布时间】:2009-06-25 09:29:40
【问题描述】:

我问这个问题是出于好奇。

我在 global.asax 中注意到了这一点

void Session_End(object sender, EventArgs e)
{
    // Code that runs when a session ends. 
    // Note: The Session_End event is raised only when the sessionstate mode
    // is set to InProc in the Web.config file. If session mode is set to StateServer 
    // or SQLServer, the event is not raised.
}

我想了解当会话模式为 StateServer 或 SQLServer 时,为什么没有捕获/引发 Session_End 事件?

【问题讨论】:

    标签: asp.net session


    【解决方案1】:

    因为ASP.NET Session State 已经不在内存中了...

    当使用不同的进程来存储会话状态时,IIS 不知道(因为它没有耦合,会话状态不再由 IIS 持有)会话何时结束.. .

    这特别是因为超时,我从未尝试过,但是当您以编程方式调用 Session.Abandon() 时会触发该事件吗??

    【讨论】:

    • 我在页面msdn.microsoft.com/en-us/library/…上发现“如果你的数据源可以配置为根据会话Timeout属性删除过期的会话数据,你可以使用SetItemExpireCallback方法引用委托为Session_OnEnd 事件并在删除过期会话数据时引发它。”因此,在这种情况下,我预计将调用重写的 RemoveItem 方法,您可以在 SetItemExpireCallback 方法中启动先前设置的委托。
    【解决方案2】:

    Session_End 事件仅由 InProc 会话管理器支持:

    ASP.NET Session-State Events (MSDN)

    "支持 Session_OnEnd 事件 仅当会话状态 Mode 属性设置为 InProc,即 默认值。如果会话状态 Mode 是 StateServer 或 SQLServer,那么 Global.asax 中的 Session_OnEnd 事件 文件被忽略。如果会话状态 模式设置为自定义,然后支持 对于 Session_OnEnd 事件是 由自定义会话状态确定 商店供应商。”

    本文介绍了如何使用 HttpModule 来模拟此功能:

    ASP.NET HttpModule for handling session end with StateServer (CodeProject)

    【讨论】:

    • 当会话状态模式设置为自定义时会怎样?
    • @Sana.91 - 可能不会,除非您编写客户处理程序来引发该事件。
    • @Anti-Santa 我该怎么做? ...我一直在寻找它,似乎没有解决方案..
    • @Sana.91 这应该让你开始:msdn.microsoft.com/en-us/library/…
    • 我在页面msdn.microsoft.com/en-us/library/…上发现“如果你的数据源可以配置为根据会话Timeout属性删除过期的会话数据,你可以使用SetItemExpireCallback方法来引用委托为Session_OnEnd 事件并在删除过期会话数据时引发它。”因此,在这种情况下,我预计将调用重写的 RemoveItem 方法,您可以在 SetItemExpireCallback 方法中启动先前设置的委托。
    猜你喜欢
    • 2015-02-23
    • 1970-01-01
    • 2021-08-30
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多