C# 将会话状态持久化到DB表

C# 将会话状态持久化到DB表,c#,.net,asp.net,sql-server,persistence,C#,.net,Asp.net,Sql Server,Persistence,使用在IIS6和SQLServer2005后端上运行的ASP.NETC#3.5 我正在实现一个复杂的基于多步骤/多用途web表单的Intranet web应用程序,它有许多控件并使用表单身份验证。这些步骤非常动态,根据用户在各个步骤中所做的选择,面板和控件呈现给用户或隐藏给用户 表单对于用户和每个任务来说都是紧张和耗时的,不会改变 我试图确保当用户返回应用程序时,已完成的步骤将被恢复,以确保用户在会话因任何原因中断时不会感到沮丧 使用名为FormStateKeeper的HTTPModule/HT

使用在IIS6和SQLServer2005后端上运行的ASP.NETC#3.5

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

表单对于用户和每个任务来说都是紧张和耗时的,不会改变

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

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

由于FormStateKeeper在身份验证超时时工作良好,因此我尝试通过创建一个存储提供程序来扩展/修改它,该存储提供程序将序列化的表单状态作为varbinary存储在DB表中,而不是作为FormStateKeeper的默认值存储在运行时缓存中。这似乎是可行的,也就是说,当反序列化并重新配置到中间页面时,表单看起来非常完美,与存储在运行时缓存中的表单完全相同

无论如何,我尝试使用DB存储来使用FormStateKeeper并没有成功

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

我对序列化/反序列化和存储上述内容没有问题,但在用户重新登录应用程序(即从中间虚拟页面生成回发等)时,我对将网页恢复到其保存状态的最佳方法有点迷茫

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


Steve

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

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

以下是一些有助于入门的文章:


我可以从我在严肃的ASP.NET/MVC网站(例如500万独立访问者和每月1100万访问量等)上工作的经验来说话。。。 我的建议是不要试图在页面上保存实际窗口小部件的状态,而是将用户的数据条目保存到一个暂存存储库中(您可以使用自定义会话提供程序,或者其他什么),该存储库中有足够的关于进程内用户状态的元数据*)。例如,如果我正在编写一个长流程的保险覆盖应用程序(我有):

真实数据:姓名、电话、性别、受抚养人、创建日期、修改日期、申请状态=‘进行中’等

元数据:最后一步完成=3,以此类推

确保您的元数据具有应用程序版本弹性…例如,如果用户在第1天进入并完成了10个步骤中的5个步骤,并且在第2天应用程序将更改为只有4个步骤,那么重试用户会发生什么:错误(如果您回答此问题,您应该被解雇);完成数据的启发式(最佳选项),新旧静态映射(iffy)。再说一次,我总是发现,当用户可以在一个流程中暂时工作到最终提交时间时,会取得更大的成功


我的两美分。

D.p.-感谢您指出应用程序版本问题-这是一个主要考虑因素。在我以前尝试修改FormStateKeeper以使用SQL表存储表单状态时,我使用了一个具有表单状态版本的列来跟踪还原与当前版本的兼容性,以避免此问题。i、 e.如果当前表单状态(已修改)应用程序与存储用户的版本不匹配,则不会进行恢复。很好的观察-谢谢。SteveDillie-O-谢谢你的建议。我研究了如何使用ASP.NETSQL会话状态。我不认为该会话对那些说几天后返回登录的用户是可用的。SQL会话状态会在这种情况下工作吗?谢谢Steve@Steve:使用自定义数据库配置,甚至自定义服务器模式(),我相信您可以使用会话状态跟踪用户ID,或者将用户ID与会话ID匹配,以便将来检索。我还没有研究过这个过程,但对我来说似乎是可行的。再次感谢。