将会话状态持久保存到数据库表

时间:2011-04-01 16:35:32

标签: c# .net asp.net sql-server persistence

使用在IIS 6和SQL Server 2005后端运行的ASP .Net C#3.5。

我正在实施一个复杂的多步骤/多用途网络表单的Intranet Web应用程序,它有许多控件并使用表单身份验证。这些步骤非常动态,面板和控件根据用户在各个步骤中所做的选择呈现给用户或从用户隐藏。

对于用户和每个授权而言,表单非常耗时且不会发生变化。

我试图确保用户不会因任何原因中断会话而感到沮丧,确保完成的步骤在返回应用程序时将恢复。

使用名为FormStateKeeper(http://fsk.codeplex.com/)的HTTPModule / HTTPHandler对用户身份验证超时的情况执行此操作。

由于FormStateKeeper适用于身份验证超时,我尝试通过创建一个存储提供程序来扩展/修改它,该存储提供程序将序列化表单状态作为varbinary存储在DB表中,而不是在FormStateKeeper的默认运行时缓存中。这似乎有效,即反序列化并重新构建到中间页面时的形式看起来与存储在运行时缓存中的形式完全相同。

无论如何,我尝试使用数据库存储使用FormStateKeeper并没有成功。

我意识到我可以序列化表单,但我也希望得到viewstate / control状态,因为整个页面/ app非常动态,控件/面板隐藏/禁用,步骤指示图形等。

序列化/反序列化并存储上述内容没有问题,但是当用户重新登录到应用程序时,将网页还原为其保存状态的最佳方法有点丢失,即从中间虚拟生成回发页面等..

非常感谢信息,建议和示例。

史蒂夫

2 个答案:

答案 0 :(得分:1)

ASP.Net有自己的内置SQL Server session state manager,您可以轻松地为您的应用程序配置。

如果将所有表单变量保存到会话中(甚至可以在后台运行一个AJAX进程来每分钟更新一次会话项,以便在添加时跟踪表单变量。

以下是一些帮助您入门的文章:

答案 1 :(得分:1)

我可以从经验中说话,因为我曾在认真的 ASP.NET / MVC网站上工作过(例如,每年有500万独立访问者和1100万次访问等)... 我的建议是不要尝试保存页面上实际小部件的状态,而是将用户的数据条目保存到暂存存储库(您自定义会话提供程序或其他任何内容)中,并提供有关状态的足够元数据进程内的用户*)。例如,如果我正在编写一个长流程保险范围应用程序(我有):

真实数据:姓名,电话,性别,家属,创建日期,修改日期,申请状态=“正在进行中”等...

元数据:最后一步完成= 3等等......

确保您的元数据具有应用程序版本弹性...例如,如果用户进入并在第1天和第2天完成10个步骤中的5个步骤,则应用程序更改为仅有4个步骤,对于撤回用户会发生什么:错误(你应该被解雇,如果你回答这个问题);已完成数据的启发式(最佳选项),旧到新的静态映射(iffy)。然后,当用户在一个过程中处于瞬态状态直到最终提交时间时,我总能找到更多的成功。

我的两分钱。