【问题标题】:ViewState, Session and StateServerViewState、Session 和 StateServer
【发布时间】:2012-04-12 16:49:15
【问题描述】:

我有一个复杂的、非常复杂的 ASP.NET WebForm 和一个大的 ViewState。目前,为了降低对浏览器的影响(通过缩小 __VIEWSTATE 隐藏输入字段),我使用PageAdapterSessionPageStatePersisterViewState 存储在Session 中。

但是,我想将会话模式从 InProc 更改为 StateServer,这样既可以降低 RAM 使用率,又可以避免站点重新启动和应用程序池回收问题。我是否需要将 ViewState 从 Session 中撤出?还是可以保持原样?

将来,我也想进行负载平衡,但我听说我可以只使用“粘性会话”,这样可能不会强迫我进入 StateServer。

注意:我目前正在使用 .NET 2.0(集成),但我愿意更新它。

【问题讨论】:

  • 您应该没有问题,因为 ViewState 是可序列化的。但是,我强烈建议您阅读 Scott Hanselman 对此的看法 - hanselman.com/blog/… - 我们在具有大 ViewStates 的页面上相当有效地使用了 HttpCompression,因此避免了任何会话内存成本。粘性会话只会确保用户访问单个服务器;如果您今天内存不足,那么它们将无济于事 - 如果用户能够针对每个请求访问不同的服务器,它们只能帮助解决您必须以其他方式分配状态的问题。

标签: asp.net session webforms viewstate


【解决方案1】:

在走这条路之前,我还会考虑其他一些选择...

我首先要研究的是 ViewState 压缩,它可以将 ViewState 的大小减少多达 60%。 Telerik 提供了一个很好的压缩模块,你可以找到here

其次,您可以在 ViewState 字段上设置最大长度,这将强制 ASP.NET 将 ViewState 划分为多个隐藏字段。这通常会产生更好的页面性能。您可以像这样在web.config 中设置PageStateFieldLength

<pages maxPageStateFieldLength="100"></pages>

【讨论】:

    【解决方案2】:

    SessionPageStatePersister 将您的 Viewstate 存储在 Session 对象中您的 Session 恰好存储在哪里。它完全不知道您的会话是 InProc、SQL 还是 StateServer,它应该继续工作而无需您做任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多