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

时间:2015-11-09 12:56:56

标签: c# asp.net session serialization

我在web.config

中有以下会话配置
<sessionState mode="InProc" timeout="1440" cookieless="false">

然而由于某种原因会话超时。所以我想要做的就是如果会话已过期,则重新加载已保存的会话,如果会话序列化可能的话。 是否可以保存Session对象然后重新加载?

2 个答案:

答案 0 :(得分:1)

只需增加会话超时属性即可。如果您想要更精细地控制Session本身,可以将sessionState模式更改为使用状态服务器或SQL服务器(https://msdn.microsoft.com/en-us/library/ms178586.aspx

答案 1 :(得分:1)

约翰尼5的评论可能在头上敲响了 - 你的过程将在一段时间不活动后关闭,所有的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可以提供的所有可扩展性和容错性,它可以在单个服务器上免费运行。