在视图状态中存储数据是否会减慢页面加载速度
本文关键字:加载 速度 视图状态 存储 数据 是否 | 更新日期: 2023-09-27 18:30:31
我已经将我的数据集存储在视图状态中(因为我需要过滤不同客户端单击的数据并显示数据),但我觉得页面加载需要很多时间,即使是没有任何代码可执行的 checbox 检查事件(使用自动回发)也需要将近 2-3 秒。
这仅仅是因为视图状态数据吗,如果是这样,是否有任何替代方法可以完成我的任务? 我需要在客户端事件上快速显示数据,所以我一直在使用视图状态。 任何解决方法都会有所帮助。
如上所述@Tushar,ViewState 不是您想要存储大量数据的地方。 它实际上只是为了在往返之间保留控件的状态,并且确实可能导致应用性能不佳。
相反,您应该查看以下服务器托管选项:
应用程序状态 - 用于存储所有用户之间共享的数据。使用服务器内存。
会话状态 - 用于存储特定于用户会话的数据。还使用服务器内存。 数据可以通过应用程序重启以及整个 Web 园或服务器场保留。来自 MSDN 的详细信息:http://msdn.microsoft.com/en-us/library/z1hkazw7.aspx
这些方法的最大缺点是内存管理,因为这两个选项都会消耗服务器内存,并保留数据,直到重新启动某种类型或会话被丢弃。 因此,这些方法并不总是可以很好地扩展。
此外,下面是一篇 MSDN 文章,讨论了状态管理的各种 .net 方法,每种方法都有优缺点:
第三种选择是通过使用 .NET 缓存库、构建自己的和/或使用第三方缓存服务器/库来实现缓存策略。使用缓存的好处是,数据在任何给定的指定时间量后自动过期。 但是,在 Web 园或服务器场环境中工作时会引入复杂性。
要记住的最重要的事情是,上述任何策略都需要在管理/共享数据方面进行一些规划和考虑。
如果在 ViewState 中存储大量数据,则会注意到性能问题。 尽管 ViewState 实际上适用于"此页面",而会话适用于"此会话",但您将达到 ViewState 大小的限制,此时会话最终的性能要好得多。
值得注意的是,您可能遇到了其他类型的问题,而不仅仅是视图状态的问题(即您的数据库查询可能需要很长时间并且可能会被缓存)。
ViewState 使页面稍微变大,因为页面的 HTML 中嵌入了额外的数据来保存序列化的 ViewState。 该额外大小是否会导致加载问题取决于连接速度,以及视图状态相对于页面其余部分的大小。
ViewState 随每个 HTTP 请求(因此包括自动回发)一起发送回服务器。 同样,这是否会导致明显的性能问题取决于视图状态大小和连接速度。
在宽带(ish)连接上,人们可以在典型页面中找到ViewState数据量,您不会看到2-3秒的额外处理时间。
诊断
使用浏览器中的开发人员工具(在 IE 中,按 F12)。 您可以监控 Web 请求,包括发送和接收的确切标头和正文。 您还可以查看每个 HTTP 请求的时间。 如果视图状态不是很大(可能不超过 1-2K),并且您的连接速度不太慢,那不是您的罪魁祸首。
选择
可以将状态完全保存在服务器端,也可以将任何较大的状态项完全放在服务器上。 您可以使用 Ajax 请求来处理依赖于该状态的页面事件。
不要多次从数据源加载数据,而只加载一次。 其他答案涉及访问数据。 我遇到过每次回发时加载数据的实例。
string myString;
public string MyString
{
get
{
// If there is already data in "myString", do not load it again!
if (this.ViewState["myData"] == null)
{
// Load data one time
this.ViewState["myData"] = "Hello";
}
return this.ViewState["myData"] as string;
}
}
ViewState 减慢页面速度的程度取决于您拥有的视图状态。我继承了生成超过一兆字节视图状态的页面,并看到 Web 服务器花费 10 秒来处理视图状态。如果您不想重写应用程序并且需要大量的视图状态,则需要研究保存/还原视图状态的替代策略。将 ViewState 保存到数据库甚至普通文件要快得多 - 不必在每个请求时将视图状态流式传输到客户端/从客户端流式传输视图状态。
不过,最好的策略是首先避免视图状态。
只是想我应该补充一点,有些控件只是视图状态猪,有些网格对于视图状态消耗来说很糟糕。
页面的来源并获取ViewState
值,并使用以下网址中的在线ViewState decoder
来检查页面的ViewState字段中存储的值有多大:
http://ignatu.co.uk/ViewStateDecoder.aspx
如果您发现您的视图状态具有较大的存储值,那么您应该找到存储Dataset
的替代方案。
无论如何,您应该避免将数据集放入视图状态中。