为什么当StateProvider不是InProc时,Session_End事件没有触发?

5

我出于好奇心提出这个问题。

我在我的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事件?
2个回答

9

因为ASP.NET会话状态不再存储在内存中...

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

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


我在 https://msdn.microsoft.com/en-us/library/ms178587.aspx?f=255&MSPPError=-2147217396 页面找到了以下信息:“如果您的数据源可以根据 session Timeout 属性配置以删除过期的会话数据,则可以使用 SetItemExpireCallback 方法引用 Session_OnEnd 事件的委托,并在删除过期的会话数据时触发它。” 因此,在这种情况下,我期望将调用覆盖的 RemoveItem 方法,并且您可以在 SetItemExpireCallback 方法中预先设置委托。 - Rudolf Dvoracek

2

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

ASP.NET Session-State Events (MSDN)

"仅当会话状态Mode属性设置为默认的InProc时,才支持Session_OnEnd事件。如果会话状态Mode设置为StateServer或SQLServer,则忽略Global.asax文件中的Session_OnEnd事件。如果会话状态Mode设置为Custom,则会根据自定义会话状态存储提供程序决定是否支持Session_OnEnd事件。"

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

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



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接