【问题标题】:Persist Session State to a DB Table将会话状态持久化到数据库表
【发布时间】:2011-04-01 16:35:31
【问题描述】:

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

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

表单对于用户来说是密集且耗时的,并且不会改变。

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

对于用户身份验证超时的情况,使用名为 FormStateKeeper (http://fsk.codeplex.com/) 的 HTTPModule/HTTPHandler 正是这样做的。

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

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

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

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

我们将不胜感激信息、建议和示例。

史蒂夫

【问题讨论】:

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


    【解决方案1】:

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

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

    这里有几篇文章可以帮助您入门:

    【讨论】:

    • Dillie-O - 感谢您的建议。我查看了使用 ASP .Net SQL 会话状态。我认为几天后返回登录的用户无法使用该会话。 SQL 会话状态会以这种方式工作吗?谢谢史蒂夫
    • @Steve:使用自定义数据库配置甚至自定义服务器模式 (msdn.microsoft.com/en-us/library/ms178586.aspx) 我相信您可以使用会话状态跟踪 UserId,或者将 UserId 与 SessionId 匹配以在未来日期。我还没有研究过这个过程,但对我来说似乎是可行的。
    • Dillie-O - 我得再看看。再次感谢。
    【解决方案2】:

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

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

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

    确保您的元数据具有应用程序版本的弹性……例如,如果用户在第 1 天进入并完成了 10 个步骤中的 5 个,而在第 2 天应用程序更改为只有 4 个步骤,那么返回用户会发生什么情况:错误 (如果你回答这个问题,你应该被解雇);对完整数据的启发式(最佳选择),旧到新的静态映射(不确定)。再说一次,当用户在最终提交时间之前可以在进程中处于临时状态时,我总是发现更成功。

    我的两分钱。

    【讨论】:

    • DP - 感谢您指出应用程序版本问题 - 这是一个主要考虑因素。在我之前尝试修改 FormStateKeeper 以使用 SQL 表来存储表单状态时,我使用了带有表单状态版本的列来跟踪还原与当前版本的兼容性以避免此问题。即,如果当前表单状态(已修改)应用程序与存储的用户版本不匹配,则不会发生还原。很好的观察-谢谢。史蒂夫
    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多