我有一个使用网络服务的网络应用。主页面运行搜索 - 通过将参数传递给特定的Web服务方法,并将结果绑定到gridview。
我在网格上实现了排序和分页。通过将网格绑定的数据表放在视图状态中,然后根据需要读取/排序/过滤它 - 并重新绑定到网格。
随着从Web服务返回的数据量急剧增加,当我尝试分页/排序等时,我收到以下错误。
重置连接
在页面加载时重置了与服务器的连接。
我已经搜索了一下,似乎一个非常大的观点状态应该归咎于此。 但肯定唯一的另一种选择是
以前我确实在会话中有数据表,因为有些数据需要在页面之间保持不变 - (不会被发布,因此viewstate不是一个选项)。随着数据量的增加以及保留它的必要性被删除,我使用了viewstate。认为这是一个比会话更好的选择,因为会话必须保持的数据量和使用该应用程序的用户数量。
似乎可能没有。
我认为当视图状态变得非常大时,.net会将其分割到多个隐藏的视图状态字段中,但似乎我得到的只是一个庞大的视图状态,我在源代码中查看时遇到了麻烦。
任何人都可以告诉我如何避免我得到的错误?如果它确实与视图状态中的数据量有关吗?
答案 0 :(得分:1)
我不会将数据放在视图状态或会话中。而是存储最小的信息,以便从Web服务重新请求数据集并存储(在视图状态或会话中,甚至在URL上)。然后使用该数据调用Web服务并对每个请求的数据做出反应。如有必要,请使用某种形式的缓存(memCache)来提高性能。
答案 1 :(得分:1)
听起来您正在缓存所有页面的整个数据集,即使您只展示了该页面的一页数据。我会将您的分页更改为仅需要用户所在当前页面的数据。
如果查询很重,你不想一遍又一遍地调用它,因为来回有很多分页(你应该测试典型的用法模式)然后我会实现某种类型的缓存在Web服务端逐页缓存(特定用户,如果数据特定于用户)并使其过期相当快(例如几个minuites)。
我认为您需要限制处理的数据总量。将代码更改为不传回可能永远不需要的额外数据是一个好的起点。
编辑:根据您的评论:
我认为你有一个完美的案例来使用Session
。这可能会给服务器带来大量用户和数据的负担,因此您可能希望实现一些逻辑来清除Session
中的数据,而不是等待它过期(例如,在某些着陆页上,您知道用户)完成后会清除会话数据。
你真的想把它从ViewState
中解脱出来,因为这是一个巨大的带宽生猪。只需查看您的物理页面大小,并且每次操作都会传递数据。将其移至Session
将消除带宽使用,并允许您执行所需的一切。
您还可以查看Web服务带回来的数据,并将其存储在您尽可能“瘦”的自定义对象中。如果您在DataSet
中存储了DataTable
或Session
,那么这些对象会有一些您可能不需要的额外开销,因此将数据存储为某个自定义瘦对象的数组并且只是绑定到那个。您需要将WS的结果映射到自定义对象,但这是减少内存使用量的好选择。
如果我还缺少其他东西,请告诉我。