是否可以在asp.net中序列化/反序列化会话对象

本文关键字:序列化 反序列化 会话 对象 net asp 是否 | 更新日期: 2023-09-27 18:21:07

我在web.config 中有以下会话配置

<sessionState mode="InProc" timeout="1440" cookieless="false">

然而,由于某些原因,会议正在超时。因此,我所要做的就是,如果会话已过期,则重新加载保存的会话,如果会话序列化是可行的是否可以保存会话对象,然后重新加载它

是否可以在asp.net中序列化/反序列化会话对象

Johnny5的评论可能一针见血——您的进程将在一段时间不活动后关闭,所有InProc会话都将丢失。我不认为Visual Studio下的IISExpress能给你一种控制这种情况的方法,所以在开发过程中考虑在成熟的IIS下运行,并将应用池的"空闲超时"属性增加到1440。

但是,如果您真的在寻找保存会话的方法,Global.asax中的session_Start和session_End事件就是这样做的一个地方。HttpSessionState不可序列化,因此您需要使用不同的序列化程序(正如Ernesto建议的那样),或者提取所有会话条目并将它们放入不同类型的可序列化集合中。(HttpApplication.Session属性是只读的,因此在任何情况下都可能最容易采用后一种方法,因为您不能只交换完整的会话实例。)

但请注意:如果您使用InProc,Session_End会出现问题——除了最琐碎的用途外,它对所有用途来说都太脆弱了。由于各种原因(预定义的时间间隔、高内存使用率、不活动等),应用程序池会定期自行回收,而且在重新启动之前,您不会得到好的Session_End事件,因此如果会话没有持久化,您将丢失会话。

这就是为什么每个人告诉你,如果你最关心你的会话,就使用流程外提供商。ASP.NET附带的SQL Server和StateServer模式是显而易见的选择,但如果您希望进行长期存储,则可能会遇到问题,因为它们不会触发Session_End事件。

我的雇主(ScaleOut Software)有一个罕见的进程外会话提供商,可以启动session_End。它是一种商业产品,但如果您只有基本需求,并且不需要ScaleOut SessionServer所能提供的所有可扩展性和容错性,它可以在单个服务器上免费运行。

只需增加会话超时属性。如果希望对会话本身进行更细粒度的控制,可以将sessionState模式更改为使用状态服务器或SQL服务器(https://msdn.microsoft.com/en-us/library/ms178586.aspx)