【问题标题】:Session State v ViewState会话状态 v ViewState
【发布时间】:2010-12-26 08:32:02
【问题描述】:

在我们的应用程序中,我们有一个“BasePage”,它声明了一些属性,这些属性或多或少地被应用程序中的每个页面使用。

在这些属性中,它们写入 ViewState。这些通常都是一个 int 或小的字符串值,没什么大不了的。例如,典型用途是调用 Web 服务并保存一个 id 以供在页面中使用。

我使用了 viewstate,因为我担心如果 IIS 回收会话变量会丢失。此外,我认为,非常小的值不会大大增加页面大小。

我是否对会话过于偏执?这会是一个更好的选择吗?

我们的环境是一个 2 台服务器集群,每台服务器上都有 SSL 终止,由负载平衡器维护的粘性会话 - 所以使用 In Proc 并不是问题,我只是非常警惕它。

【问题讨论】:

    标签: asp.net session viewstate


    【解决方案1】:

    如果不是敏感数据,我也希望将其存储在 HTML 中而不是会话中。

    【讨论】:

      【解决方案2】:

      我认为最好尽可能避免使用会话状态,尤其是在服务器集群上,即使您使用的是粘性会话。当 IIS 回收时(如您所说),会话可能会过期或消失。

      我会保留 ViewState 或 cookie 中的值。

      【讨论】:

        【解决方案3】:

        永远不要相信您的用户发送的数据。

        即使您收到的所有数据都是不敏感的,如果您将其发送到您的用户浏览器,您应该在使用前再次检查它。也许大多数用户都是合法的,但只有一个用户可以破坏您的应用程序。

        您有哪些存储数据的选择?

        • 隐藏字段;在客户端很容易被篡改
        • 饼干;保留用户特定数据的古老方法,但大小非常有限。
        • 视图状态;您的数据会使用带宽传输到客户端并返回,并且可能会被篡改。
        • 会话,InProc;在应用程序池被回收之前,您永远不会遇到问题
        • 会话,状态服务器;您将会话数据保存在另一个服务器进程中。
        • 会话、数据库;可以处理几乎(如果不是全部)负载平衡方案,因为您不需要固定会话,也不必担心应用程序池回收。您的所有数据都属于我们您的 SQL Server。

        阅读您的场景,您可能需要处理进程外会话存储。

        【讨论】:

        • 我认为在我们的例子中,我会坚持使用视图状态,因为对象是极轻的类型。我已经测量了设置前后的视图状态,而且它很小。我们确实查看了 out of proc, sql session storage,但我们的基础架构人员表示,由于 I/O 负载增加,它不值得性能损失(请注意,如果我们的环境发生变化并且我们必须这样做,我们可能会再次查看它)。不过,很好的选项总结,谢谢至少从我阅读所有这些帖子来看,除了增加的页面大小之外,我没有做任何严重错误的事情
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 2011-06-07
        • 2010-10-22
        • 2014-05-30
        • 2013-02-19
        • 2013-07-31
        相关资源
        最近更新 更多