序列化为asp.net会话状态

时间:2011-07-04 13:36:29

标签: asp.net session-state

我使用“inproc”作为单个服务器中的会话管理的ASP.NET网站。现在,我需要将Web站点放在Web场中的两个服务器上(在负载平衡环境之后)。我们了解到“inproc”模式在Web场环境中不再起作用。所以,我正在寻找从“inproc”切换到SQL服务器模式的选项。另外,我了解到更新web.config不是问题(当然,创建SQL数据库)。因为,我正在将数据表,用户定义的类,List,...保存到会话变量中。我知道我必须将用户定义的类设置为可序列化(只需将[Serializable]放在类中),.NET将负责其余的(我不必明确地放置代码来处理它)。

这是对的吗?而且,其他“特殊”类型如DataTable,List,如何使它们可以进行分类呢?

感谢。

3 个答案:

答案 0 :(得分:1)

这基本上是正确的,虽然制作课程,测试所有内容等背后的工作并非无足轻重。您需要在会话中存储的所有内容都需要序列化,因此对于“特殊”数据类型,您需要生成它们的序列化版本。您可能想看看为什么要将数据表保存到会话状态?我建议你很好地看看你在做什么,并且只保存最小量 - 键不是整个对象。

我当前的客户端正在使用包含许多大对象的SQL会话,并且运行缓慢,因为需要对这些大对象进行序列化和反序列化,以及从DB写入和读取。

你可能有时会意识到为什么人们会说会话变量是个坏主意。可伸缩性是一个大问题,无论是你现在要做的工作量还是sql会话存储的大小问题。

ETA:正如其他人所说,对于任何类型的会话状态,可序列化问题都是相同的。

答案 1 :(得分:1)

我还必须将应用程序从InProc切换到SqlSessionState

    {li>对于DataTable,它已经是Serializable 1
  • 对于List<T>,当且仅当T是Serializable时才可序列化。

大多数.NET简单类型都是Serializable。但是,如果您声明并使用自己的类,则必须将它们声明为Serializable,以便将它们存储在会话中。

TL;博士;将Sessionstate切换到SqlServer并序列化直到它工作。

第二个测试是确保两台服务器的加密和解密上下文相同。请阅读http://msdn.microsoft.com/en-us/library/w8h3skw9%28v=vs.71%29.aspx并确保两台服务器使用相同的密钥。

答案 2 :(得分:0)

为了强化@ AD.Net的评论,如果你能够使用inProc模式存储对象,那么在使用序列化方面的其他模式时应该没有问题。

对于像datatable这样的对象,你会发现according to MSDN这些类已被标记为可序列化。