非常大的viewstate打破web应用程序

时间:2010-08-26 15:48:33

标签: asp.net sorting pagination viewstate

我有一个使用网络服务的网络应用。主页面运行搜索 - 通过将参数传递给特定的Web服务方法,并将结果绑定到gridview。

我在网格上实现了排序和分页。通过将网格绑定的数据表放在视图状态中,然后根据需要读取/排序/过滤它 - 并重新绑定到网格。

随着从Web服务返回的数据量急剧增加,当我尝试分页/排序等时,我收到以下错误。

重置连接

在页面加载时重置了与服务器的连接。

我已经搜索了一下,似乎一个非常大的观点状态应该归咎于此。 但肯定唯一的另一种选择是

  1. 限制结果
  2. 将数据表粘贴在会话中而不是视图状态
  3. 我不知道的其他事情
  4. 以前我确实在会话中有数据表,因为有些数据需要在页面之间保持不变 - (不会被发布,因此viewstate不是一个选项)。随着数据量的增加以及保留它的必要性被删除,我使用了viewstate。认为这是一个比会话更好的选择,因为会话必须保持的数据量和使用该应用程序的用户数量。

    似乎可能没有。

    我认为当视图状态变得非常大时,.net会将其分割到多个隐藏的视图状态字段中,但似乎我得到的只是一个庞大的视图状态,我在源代码中查看时遇到了麻烦。

    任何人都可以告诉我如何避免我得到的错误?如果它确实与视图状态中的数据量有关吗?

2 个答案:

答案 0 :(得分:1)

我不会将数据放在视图状态或会话中。而是存储最小的信息,以便从Web服务重新请求数据集并存储(在视图状态或会话中,甚至在URL上)。然后使用该数据调用Web服务并对每个请求的数据做出反应。如有必要,请使用某种形式的缓存(memCache)来提高性能。

答案 1 :(得分:1)

听起来您正在缓存所有页面的整个数据集,即使您只展示了该页面的一页数据。我会将您的分页更改为仅需要用户所在当前页面的数据。

如果查询很重,你不想一遍又一遍地调用它,因为来回有很多分页(你应该测试典型的用法模式)然后我会实现某种类型的缓存在Web服务端逐页缓存(特定用户,如果数据特定于用户)并使其过期相当快(例如几个minuites)。

我认为您需要限制处理的数据总量。将代码更改为不传回可能永远不需要的额外数据是一个好的起点。

编辑:根据您的评论:

  1. 您无法更改网络服务
  2. 用户可以通过过滤或排序来操作查询
  3. Web服务返回了大量数据
  4. 数据是用户特定的
  5. 我认为你有一个完美的案例来使用Session。这可能会给服务器带来大量用户和数据的负担,因此您可能希望实现一些逻辑来清除Session中的数据,而不是等待它过期(例如,在某些着陆页上,您知道用户)完成后会清除会话数据。

    你真的想把它从ViewState中解脱出来,因​​为这是一个巨大的带宽生猪。只需查看您的物理页面大小,并且每次操作都会传递数据。将其移至Session将消除带宽使用,并允许您执行所需的一切。

    您还可以查看Web服务带回来的数据,并将其存储在您尽可能“瘦”的自定义对象中。如果您在DataSet中存储了DataTableSession,那么这些对象会有一些您可能不需要的额外开销,因此将数据存储为某个自定义瘦对象的数组并且只是绑定到那个。您需要将WS的结果映射到自定义对象,但这是减少内存使用量的好选择。

    如果我还缺少其他东西,请告诉我。