gpt4 book ai didi

asp.net - 非常大的 View 状态破坏网络应用程序

转载 作者:行者123 更新时间:2023-12-03 21:54:43 25 4
gpt4 key购买 nike

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

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

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

连接已重置

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

我四处搜索了一下,似乎这是一个非常大的 View 状态造成的。但可以肯定的是,唯一的其他选择是

  1. 限制结果
  2. 在 session 中粘贴数据表而不是 View 状态
  3. 还有一些我不知道的

之前我确实在 session 中有数据表,因为其中一些数据需要在页面之间持久保存——(但没有发布,所以 View 状态不是一个选项)。随着数据量的增加以及持久化数据的必要性被移除,我改为使用 View 状态。认为这是比 session 更好的选择,因为 session 必须保存的数据量和使用该应用程序的用户数量。

看起来可能不是。

我认为当 View 状态变得非常大时,.net 将它拆分为多个隐藏的 View 状态字段,但似乎我得到的只是一个我无法在源代码中查看的庞大 View 状态。

谁能告诉我如何避免我遇到的错误?是否确实与viewstate中的数据量有关?

最佳答案

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

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

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

编辑:根据您的评论:

  1. 您不能更改网络服务
  2. 用户可以通过过滤或排序操作查询
  3. 网络服务返回大量数据
  4. 数据是用户特定的

那么我认为您有一个使用 Session 的完美案例。这可能会给服务器带来大量用户和数据的负担,因此您可能希望实现一些逻辑来清除 Session 中的数据,而不是等待它过期(比如在某些登录页面上知道用户完成后会离开,清除 session 数据)。

你真的想把它从 ViewState 中取出来,因为它是一个巨大的带宽消耗者。只要看看你的物理页面大小,数据就会随着每个 Action 来回传递。将其移至 Session 将消除带宽使用并允许您执行所需的一切。

您还可以查看 Web 服务带回的数据,并将其存储在尽可能“精简”的自定义对象中。如果您在 Session 中存储 DataSetDataTable,这些对象有一些您可能不需要的额外开销,因此将数据存储为一些自定义薄对象的数组,然后绑定(bind)到它。您需要将 WS 的结果映射到您的自定义对象,但这是减少内存使用量的好选择。

如果还有其他遗漏,请告诉我。

关于asp.net - 非常大的 View 状态破坏网络应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3576853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com