2011-04-01 70 views
2

使用在IIS 6和SQL Server 2005后端上运行的ASP .Net C#3.5。将会话状态保存到数据库表

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

对于不会改变的用户和每个任务来说,表单非常耗时且耗时。

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

对于用户认证超时的情况,使用名为FormStateKeeper(http://fsk.codeplex.com/)的HTTPModule/HTTPHandler完成此操作。

因为FormStateKeeper对于身份验证超时非常适用,我试图通过创建一个存储提供程序来扩展/修改它,将存储序列化表单状态作为varbinary存储在数据库表中,而不是存储在FormStateKeeper的默认运行时缓存中。这似乎工作,即反序列化和重构到中间页面中的表单看起来很完美,并且与存储在运行时缓存中的表单完全相同。

无论如何,我尝试使用FormStateKeeper使用数据库存储尚未成功。

我知道我可以只序列化的形式,但我想获得的视图状态/控制状态也因为整个页/应用程序是非常动态的控制/面板隐藏/禁用,步骤指示图形等

我没有任何问题序列化/反序列化和存储上述,但有点丢失的最好的方法来将网页恢复到它的保存状态,当用户登录到应用程序时保存状态,即从中间虚拟页面生成回发等..

信息,建议和例子将不胜感激。

史蒂夫

回答

1

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

如果您保存您的所有表单变量到会话(你甚至可以有一个AJAX程序运行在后台更新会话项目每分钟左右,在添加他们跟踪表单变量。

这里有一对夫妇的文章,帮助上手:

+0

Dillie-O - 谢谢你的建议。我看着使用ASP .Net SQL会话状态。我不认为这个会话对于说几天后返回登录的用户是可用的。 SQL会话状态是否在这个时尚中起作用?谢谢史蒂夫 – Steve 2011-04-01 17:35:37

+0

@Steve:使用自定义数据库配置甚至自定义服务器模式(http://msdn.microsoft.com/en-us/library/ms178586.aspx)我相信你可以跟踪会话状态的UserId,或将UserId与SessionId相匹配以便在未来的日期进行检索。我没有看过这个过程,但对我来说似乎是可行的。 – 2011-04-01 17:57:02

+0

Dillie-O - 我不得不再看看那个。再次感谢。 – Steve 2011-04-01 18:27:35

1

我可以从我的工作经验严重 ASP.NET/MVC网站(例如每月访问量为500万独立访问者和1100万次访问等)... 我的建议是不尝试保存页面上实际小部件的状态,而是将用户的数据条目保存到临时存储库中(您自定义会话提供者,或其他任何人)提供足够的有关过程*)中用户的状态的元数据。例如,如果我正在编写长期流程保险申请表(我有):

真实数据:姓名,电话号码,性别,受抚养人,创建日期,修改日期,申请状态='进行中'等。 ..

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

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

我的两分钱。

+0

D.P. - 感谢您指出应用程序版本问题 - 这是一个主要考虑因素。在我之前尝试修改FormStateKeeper来使用SQL表来存储表单状态时,我使用了一个包含表单状态版本的列来跟踪当前版本的还原兼容性以避免此问题。即如果当前表单状态(修改的)应用程序与存储的用户版本不匹配,则不会发生恢复。伟大的观察 - 谢谢。史蒂夫 – Steve 2011-04-01 17:30:34